当前位置: 首页 > news >正文

行列式计算的两种方法

#include<iostream> 
#include<cstring>
#include<cstdio>
#include<algorithm>
#define N 100 
using namespace std;
int a[N][N];
double aa[N][N];
int n;

/**********************************************************/
//求行列式的值:是所有取自不同行不同列的n个元素的乘积 
int d[N];
int tmpd[N]; 
int dd[N];
int vis_column[N];//是否在同一列 
int inverse;//逆序数的个数 
int ans = 0;
void merger(int ld, int rd){
    if(ld >= rd) return;
    int mid=(ld+rd)>>1;
    merger(ld,mid);
    merger(mid+1, rd);
    int i=ld, j=mid+1, k=0;
    while(i<=mid && j<=rd){
        int col1 = (tmpd[i]-1)%n+1;
        int col2 = (tmpd[j]-1)%n+1;
        if(col1 < col2){
            dd[++k] = tmpd[i++];
        } else {
            dd[++k] = tmpd[j++];
            inverse += mid-i+1; 
        }
    }
    while(i<=mid) dd[++k] = tmpd[i++];
    while(j<=rd) dd[++k] = tmpd[j++];
    memcpy(tmpd+ld, dd+1, sizeof(int)*(k));
}

void determinantValue(int row){
    if(row>n){
        inverse=0; 
        int tmp = 1;
        for(int k=1; k<=n; ++k){
            int i = (d[k]-1)/n+1;
            int j = (d[k]-1)%n+1;
            tmp *= a[i][j];
        }
        memcpy(tmpd, d, sizeof(int)*(n+1));
        merger(1, n);
        if(inverse&1) ans-=tmp;
        else ans+=tmp;
        return;
    }
    for(int col=1; col<=n; ++col)
        if(!vis_column[col]){
            vis_column[col]=1;
            d[row] = (row-1)*n + col;
            determinantValue(row+1);
            vis_column[col]=0;
        }
}
/**********************************************************/

/**********************************************************/
//以列主元方法,将行列式转变成上三角矩阵

double determinantValueA(){
    int sign = 1;
    double ret = 0.0;
    for(int i=1; i<=n; ++i){
        double maxVal = aa[i][i];
        int j = i;
        for(int k=i+1; k<=n; ++k)//寻找这一列中的元素值的最大值 
            if(maxVal < aa[k][i]){
                maxVal = aa[k][i];
                j = k;
            }
        if(j!=i){
            sign = -sign;
            for(int k=1; k<=n; ++k){//交换两行 
                double tmp = aa[i][k];
                aa[i][k] = aa[j][k];                 
                aa[j][k] = tmp;
            }
        }
        if(maxVal < 1e-10)//最大值为0,也就是意味这对角线上的元素有0出现 
            return ret;
            
        for(int k=i+1; k<=n; ++k){
            double b = aa[k][i]/aa[i][i];
            for(int c=1; c<=n; ++c) 
                aa[k][c] -= b*aa[i][c];
        }
    }
    ret = 1.0;
    for(int i=1; i<=n; ++i)
        ret*=aa[i][i];
    return ret;
}
 
/**********************************************************/
int main() {
//    cin>>n;
//    for(int i=1; i<=n; ++i)
//        for(int j=1; j<=n; ++j)
//            cin>>a[i][j];
//    determinantValue(1);
//    cout<<ans<<endl;
    
    cin>>n;
    for(int i=1; i<=n; ++i)
        for(int j=1; j<=n; ++j)
            cin>>aa[i][j];
    cout<<determinantValueA()<<endl;
    return 0;
}
/*
4
3 4 5 11
2 5 4 9
5 3 2 12
14 -11 21 29

4
2 0 0 0
0 2 0 0
0 0 2 0
0 0 0 2 

2
1 2 3 4
*/

 

相关文章:

  • Android源码解析--超好看的下拉刷新动画
  • ES6核心内容精讲--快速实践ES6(二)
  • C++——编程常见错误
  • linux -硬盘分区
  • [8-27]正则表达式、扩展表达式以及相关实战
  • django 名词解释
  • CSS 样式显示为小手
  • javascript exec match 区别
  • python的sorted函数
  • 老程序员总结的15+条经验教训
  • 使用PullToRefresh实现下拉刷新和上拉加载
  • 本地apt
  • [路径规划] VFF和VFH
  • 三招破局 轻松搞定大型直播晚会
  • 一次性代码(单例)
  • ES6指北【2】—— 箭头函数
  • 《深入 React 技术栈》
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • AWS实战 - 利用IAM对S3做访问控制
  • Cookie 在前端中的实践
  • isset在php5.6-和php7.0+的一些差异
  • java正则表式的使用
  • java中具有继承关系的类及其对象初始化顺序
  • Laravel 中的一个后期静态绑定
  • leetcode46 Permutation 排列组合
  • Python学习之路16-使用API
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • Spring框架之我见(三)——IOC、AOP
  • Sublime text 3 3103 注册码
  • vue数据传递--我有特殊的实现技巧
  • zookeeper系列(七)实战分布式命名服务
  • 半理解系列--Promise的进化史
  • 翻译--Thinking in React
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 小程序 setData 学问多
  • 异步
  • 正则表达式小结
  • 湖北分布式智能数据采集方法有哪些?
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #{} 和 ${}区别
  • #QT(一种朴素的计算器实现方法)
  • $.ajax,axios,fetch三种ajax请求的区别
  • (1)Android开发优化---------UI优化
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (八)Spring源码解析:Spring MVC
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (转) Android中ViewStub组件使用
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .net MVC中使用angularJs刷新页面数据列表