已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
行列式的求值(C语言版)本程序用C语言实现行列式的求值,由于采用的是行列式中最原始的公式求解,其运行效率并不十分高,但可以保证只要电脑能跑下来,就可以算对.本人验证表明,对9阶以内的运行效果还可以.10阶就不好说了.本程序实际上是分二部分,第一部分是程序求0到n-1或1到n的全排列,并采用文件操作,将排列结果保存在一个文件中;第二部分是用数学方法求行列式的值,并从文件中读取排列结果并计算p(a1,a2,a3an).本人设想的另一种办法是采用多线程,当生成一种排列后直接送到计算程序,或计可以加快计算速度.有名的MATLAB计算高阶行列式时(例如80阶)简直是不用眨眼就出来了,不知道用的是什么算法.第一部分的算法已单独的上传在本文揖中,名为.用户在使用时要将以下5个文件全部编译一遍才行.(本机运行环境是xpsp3+vc6.0+)plzh为排列组合det为行列式./头文件 plzh.h#ifndef PLZH_H#define PLZH_H#include #include void initial(int n);int stackfull(int n);void stackprint(int n);void stackoutfile(int n);void stackback();void stackadd(int n);void stackmov(int n);void stackfun(int n);#endif/plzh.h的实现 plzh.c#include #include #include plzh.h#define N 50 /定义栈的大小. int stackN; /定义栈.int p=-1; /定义栈底.int aN,bN,cN; /分别表示当前数的值,改变后的值,及改变的次数.FILE *pfile;/*对栈进行初始化.*/void initial(int n) int i=0;for(i=0;in;i+)stack+p=i; /第一次初始化的值.ai=bi=i; /初始值相同.ci=0; /0表示尚未改变过./*判断栈是否已满,在本程序中,此函数实际上是多余的.*/int stackfull(int n) if(p+1=n)return 1;elsereturn 0;/*打印栈中的数值.*此处是输出到屏幕上.*/void stackprint(int n)int i=0;for(i=0;in;i+)printf(%d ,stacki);printf(n);/*也可输出到文件中.*/void stackoutfile(int n)fwrite(stack,sizeof(int),n,pfile);/*退栈.*实际上这个可以省去,但为了更好理解,写成一个函数.*/void stackback()p-;/*当经过一次退栈后,当前栈顶是p,则p+1到n-1* 中并没有填充数字,此函数的作用就是为后面* 的栈中重新入栈.*并且此处是有规律的入栈.*/void stackadd(int n)int j,k,flag; /j,k是控制变量,flag是标志变量.while(1+pn) /一直循环到最后./*此段的作用是使当前填充的值与前面的都不相同.*用for循环控制.*/for(j=0;jn;j+) flag=0;for(k=0;k=p;k+)if(j=stackk) /若与某一个栈相同,则重新对j赋值.flag=1;break;if(flag=0) /当flag为0时,表示赋值成功.stack+p=j; /当此值赋到栈中.ap=bp=j;/同时重新定义当前值,并使其相等.相当于又初始化.cp=0; /把值的改变次数定义为0.break;/*本程序的核心所在.*算法是若退栈到当前值,则改变当前值.*使当前栈值bp=(bp+1)%n;*/void stackmov(int n)int flag,i;while(1)bp=(bp+1)%n; /此处比较好理解,即循环.cp+; /记录值的变化.flag=0; /0表示赋值成功,1表示要赋的值已被占用. for(i=0;ip;i+)if(bp=stacki) /要赋的值已存在.flag=1;break;if(flag=1) /若赋值失败则进行下一轮的赋值.continue;if(ap=bp)|flag=0) /结果是要么赋值成功,要么回到原来的值.break;if(flag=0&(ap!=bp) /当赋值成功.stackp=bp; /将值赋进栈中.stackadd(n); /对该栈后面的值进行填充.else /当回到原来的位置,要退栈.stackback();/*此处是接口函数.*/void stackfun(int n)pfile=fopen(dat.ttt,wb);initial(n); /初始化.if(stackfull(n) /初始化后本身就是一个成功的排列,打印出来./stackprint(n);stackoutfile(n);while(1) /一直循环下去,直到退无可退./*这是本程序中最关键的一条指令.*此处的退栈仅且只能在值尚未发生变化的情况下退栈.*若没有cp!=0,当退到任一个栈时,他们的初始状态都是ap=bp*若是(ap=bp)&cp!=0表明当前栈已是退无可退.*此处有个关键时,第一轮开始的时候并没有执行该指令,当栈顶值循环一轮后*使cp!=0后才开始执行的,要特别注意这个地方.*/if(ap=bp)&cp!=0) stackback();stackmov(n); /退完栈后要补齐后面的.if(stackfull(n)/stackprint(n);stackoutfile(n);if(p=-1) /结束的条件,退无可退.break;fclose(pfile);/ 行列式求值方法的头文件 det.h#ifndef DET_H#define DET_H#include #include void detcal();#endif/det.h 的实现方法det.c#include #include #include det.h#include plzh.h#define N 20void detcal()int colNN,RN;int sum,count;int n;int i,j;FILE *pfile;printf(输入行列式的阶(输0退出): );scanf(%d,&n);if(n=0)exit(0);printf(按行输入行列式的项: );for(i=0;in;i+)for(j=0;jn;j+)scanf(%d,&colij);stackfun(n);sum=0;pfile=fopen(dat.ttt,rb);/*此处遇到的巨大问题时,最后一行会读二遍,*即feof不是十分管用,所以采用如下策略,*将fread()使用两遍,最后一次将因为提前读,*而被feof()判出界.*/fread(R,sizeof(int),n,pfile);while(!feof(pfile)count=0;for(i=0;in-1;i+)for(j=i+1;jRj)count+;if(count%2=0)count=1;elsecount=-1;for(i=0;in;i+)count*=coliRi;sum+=count;fread(R,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 标准化内部控制合同2024版合同范本版
- 简版城市租房合同
- 2023年清理去石设备项目成效分析报告
- 2024年软泡聚醚项目评估分析报告
- 2024至2030年中国咖啡棒行业投资前景及策略咨询研究报告
- 2024年中国纸箱机械市场调查研究报告
- 2024年中国球型游艇罗经市场调查研究报告
- 2024年中国智能发射机市场调查研究报告
- 游乐场骑乘玩具项目评价分析报告
- 二手车买卖合同2024年
- 2023年甘肃白银有色集团股份有限公司招聘考试真题
- 人教版三年级语文上册第三、四单元试卷(含答案)
- 电磁场与电磁波(第五版)完整全套教学课件
- 主题三 第2课 设计制作我的汽车(教学设计)教科版六年级下册综合实践活动
- 2024年山东省青岛市中考数学试卷(附答案)
- 2024年网络安全宣传周网络安全知识竞答考试题库500题(含答案)
- 云南省昆明市官渡区2023-2024学年八年级上学期期末语文试题
- 2024义务教育语文课程标准(2022版)考试试题库(含答案)
- (教科版)小学3-6年级科学实验报告
- 云南省食品安全管理制度
- 孤残儿童护理员技能鉴定考试题库(含答案)
评论
0/150
提交评论