纯C语言行列式的计算

编程入门 行业动态 更新时间:2024-10-21 03:38:57

纯C语言<a href=https://www.elefans.com/category/jswz/34/1750246.html style=行列式的计算"/>

纯C语言行列式的计算

萌新写了一整天终于写出来了,其中部分算法是从B站正月点灯笼 大佬那里学来的(网址[算法教程] 全排列_哔哩哔哩_bilibili),特此感谢。

支持输入分数,负数。目前无法输入小数。

输入时,同一行的元素用一个空格隔开,别多打,没有做冗余。每行元素之间用一个回车隔开,双击回车结束输入。我设置的最多是5阶行列式,如果需要更多的话就改两个#define,第一个是阶数的上限,第二个是上限的阶乘(主要是用来储存tor的)。

我是用的vc2010编译的,有的部分可能最后的暂停不是一个格式,各位大佬随便改改吧,实在不想改也可以直接删掉。大概这样,上代码:

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define max 5//阶数上限
#define mjc 120//阶数上限的阶乘void swap(int c[],int i,int j);
void print(int c[],int d[][max],int n,int *r);
void perm(int c[],int d[][max],int p,int q,int *r);
int jc(int x);
void tor(int d[][max],int t[]);void main()
{int row=0,c[max],to[mjc];int *ro=&row;int d[mjc][max];//矩阵输入short i,j,k;short n=-1,r=0;//line,rowchar t=0;int cup=0;double A[max][max]={0},sum=0,culti=1;short flag=0;short f1=0,f2=0;//负号和分号标识printf("请输入行列式:\n");for(i=0,j=0,k=0;;k++){scanf("%c",&t);if(t=='-')f1=1;if(f2){if(t>='0'&&t<='9')cup=cup*10+(t-48);}if(t=='/')f2=1;if(!f2)//整数部分{if(t>='0'&&t<='9'&&(!f1))A[i][j]=A[i][j]*10+(t-48);if(t>='0'&&t<='9'&&f1)A[i][j]=A[i][j]*10-(t-48);}if(t==' ')//结束这一元素{if(f2){A[i][j]/=cup;//统一cup=0;}t=0;f1=0;f2=0;/*归零*/j++;}if(t=='\n'&&flag)break;//结束这一矩阵flag=0;if(t=='\n'&&(!flag))//换行{if(f2){A[i][j]/=cup;//统一cup=0;}flag=1;//换行标识变更f1=0;f2=0;i++;n=j+1;/*归零*/j=0;}}r=i;if(r!=n){printf("error!This isn't a square\n");}//输入结束//开始运算else{sum=0;//重复利用for(i=0;i<n;i++)c[i]=i+1;perm(c,d,0,n-1,ro);*ro=0;tor(d,to);for(i=0;i<jc(n);i++){for(j=0;j<n;j++){culti*=A[j][(d[i][j])-1];}sum+=to[i]*culti;culti=1;}printf("sum=%lf",sum);}printf("\n");system("pause");//暂停程序,方便使用时查看结果,根据编译器不同请自行选择删除或更改
}void swap(int c[],int i,int j){int temp=c[i];c[i]=c[j];c[j]=temp;
}void print(int c[],int d[][max],int n,int *ro){int i;for(i=0;i<n;i++){d[*ro][i]=c[i];}*ro+=1;
}void perm(int c[],int d[][max],int p,int q,int *ro){if(p==q){print(c,d,q+1,ro);}else{int i;for(i=p;i<=q;i++){swap(c,p,i);perm(c,d,p+1,q,ro);swap(c,p,i);}}
}int jc(int x){if(x==0)return 1;return jc(x-1)*x;
}void tor(int d[][max],int t[]){int i,j,r,sum=0;for(r=0;r<mjc;r++){for(i=0;i<max;i++){for(j=i;j<max;j++){if(d[r][i]>d[r][j])sum++;}}if(sum%2)t[r]=-1;else t[r]=1;sum=0;}
}

人比较菜,有的地方可能不是最优解,希望大佬们指点。

-----------------------------二次编辑-----------------------------

之前那一次剪贴板到上限了,没复制全,这回应该没问题了。

更多推荐

纯C语言行列式的计算

本文发布于:2024-02-06 16:36:06,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1750346.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:行列式   语言

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!