试验一
2015-12-16 16:40
141 查看
#include<stdio.h> #include<stdlib.h> #include<time.h> int path[9][9]; int s1() { int choose,n,i; long result,start,end,a=0,b=1,c; printf("\n进入Fibonacci序列问题\n"); printf("1.用两种方法分别求最大的n\n"); printf("2.输入n求Fibonacci数\n"); printf("请选择:"); scanf("%d",&choose); if(choose==1) { n=1; start=clock(); do { result=a+b; a=b; b=result; printf("第%d个Fibonacci数:%d\n",n,a); n++; }while(result>=a); end=clock(); printf("\n迭代求得最大的n为%d,用时%d毫秒\n",n-1,end-start); n=1,a=0,b=1; start=clock(); n=F(a,b,n); end=clock(); printf("\n递归求得最大的n为%d,用时%d毫秒\n",n,end-start); } else if(choose==2) { printf("\n请输入一个整数n:"); scanf("%d",&n); if(n<0) printf("请输入正数!"); else if(n>0&&n<3) printf("Fibonacci(%d)=1\n",n); else if(n>2) { for(i=1;i<n;i++) { result=a+b; a=b; b=result; } printf("Fibonacci(%d)=%d\n",n,result); } } printf("\n退出并返回主菜单\n\n"); } int F(int a,int b,int n) { if((a+b)<b) { return n; } else { printf("第%d个Fibonacci数:%d\n",n,b); F(b,a+b,n+1); } } void s2() { int n,choose,i,j,k,a[10][10],b[10][10],c[10][10]; printf("\n进入矩阵相乘问题\n"); printf("请输入需要计算的矩阵阶数(10以内):"); scanf("%d",&n); if(n<=0) printf("请输入正数!"); else if(n>0) { printf("\n1.随机生成矩阵数据\n"); printf("2.手动输入矩阵数据\n"); printf("请选择:"); scanf("%d",&choose); if(choose==1) { srand(time(0)); for(i=0;i<n;i++) for(j=0;j<n;j++) a[i][j]=rand()%10; for(i=0;i<n;i++) for(j=0;j<n;j++) b[i][j]=rand()%10; } else if(choose==2) { for(i=0;i<n;i++) for(j=0;j<n;j++) { printf("a矩阵第%d行第%d列:"); scanf("%d",&a[i][j]); } for(i=0;i<n;i++) for(j=0;j<n;j++) { printf("b矩阵第%d行第%d列:"); scanf("%d",&b[i][j]); } } //输出当前两个矩阵 printf("\na矩阵:\n"); for(i=0;i<n;i++) { for(j=0;j<n;j++) printf("%d ",a[i][j]); printf("\n"); } printf("\nb矩阵:\n"); for(i=0;i<n;i++) { for(j=0;j<n;j++) printf("%d ",b[i][j]); printf("\n"); } //选择算法 printf("\n1.蛮力法计算\n"); printf("2.分治法计算\n"); printf("请选择:"); scanf("%d",&choose); if(choose==1) { for(i=0;i<n;i++) for(j=0;j<n;j++) c[i][j]=0; for(i=0;i<n;i++) for(j=0;j<n;j++) { for(k=0;k<n;k++) c[i][j]=c[i][j]+a[i][k]*b[k][j]; } printf("\n结果矩阵:\n"); for(i=0;i<n;i++) { for(j=0;j<n;j++) printf("%-5d",c[i][j]); printf("\n"); } } else if(choose==2) {} } printf("\n退出并返回主菜单\n\n"); } void s3() { int i,x,choose,c[7]; printf("\n进入8枚硬币问题\n"); printf("1.随机生成假币\n"); printf("2.手动输入假币编号(1-8)\n"); printf("请选择:"); scanf("%d",&choose); if(choose==1) { srand(time(0)); x=rand()%7+1; } else if(choose==2) { scanf("%d",&x); } for(i=0;i<7;i++) c[i]=1; c[x-1]=2; if((c[0]+c[2]+c[4])==(c[1]+c[3]+c[5])) { printf("1、3、5号硬币和2、4、6号硬币一样重\n"); if(c[6]==c[4]) { printf("7号硬币和5号硬币一样重\n"); printf("8号硬币是假币\n"); } else { printf("7号硬币和5号硬币不一样重\n"); printf("7号硬币是假币\n"); } } else { printf("1、3、5号硬币和2、4、6号硬币不一样重\n"); if((c[0]+c[2])==(c[1]+c[3])) { printf("1、3号硬币和2、4号硬币一样重\n"); if(c[4]==c[2]) { printf("5号硬币和3号硬币一样重\n"); printf("6号硬币是假币\n"); } else { printf("5号硬币和3号硬币不一样重\n"); printf("5号硬币是假币\n"); } } else { printf("1、3号硬币和2、4号硬币不一样重\n"); if(c[0]==c[1]) { printf("1号硬币和2号硬币一样重\n"); if(c[0]==c[2]) { printf("1号硬币和3号硬币一样重\n"); printf("4号硬币是假币\n"); } else { printf("1号硬币和3号硬币不一样重\n"); printf("3号硬币是假币\n"); } } else { printf("1号硬币和2号硬币不一样重\n"); if(c[0]==c[2]) { printf("1号硬币和3号硬币一样重\n"); printf("2号硬币是假币\n"); } else { printf("1号硬币和3号硬币不一样重\n"); printf("1号硬币是假币\n"); } } } } } void HAd1(int a[],int i,int nLength) { int Child; int nTemp; for(;2*i+1<nLength;i=Child) { Child=2*i+1; if(Child<nLength-1&&a[Child+1]>a[Child]) Child++; if(a[i]<a[Child]) { nTemp=a[i]; a[i]=a[Child]; a[Child]=nTemp; } } } /*void kkk() { int a,b,c[2000]; c[0]=b+a; printf("#\n"); for(a=0;a<2000;a++) if(b) c[a]=++b; }*/ void s4() { int i,t,ch,choose,ma[9]; long start,end; short Auto[1500]; //for(i=2000;i>=0;i--) //kkk(); printf("\n进入堆排序问题\n"); printf("1.手动输入检测可用性(10个数据)\n"); printf("2.随机生成2000个数据检测时间效率\n"); printf("请选择:"); scanf("%d",&choose); if(choose==1) { printf("每次回车输入一个数据:\n"); for(i=0;i<10;i++) scanf("%d",&ma[i]); for(i=4;i>=0;i--) HAd1(ma,i,10); for(i=8;i>0;--i) { t=ma[0]; ma[0]=ma[i]; ma[i]=t; HAd1(ma,0,i); } printf("排序结果:\n"); for(i=0;i<10;i++) printf("%d ",ma[i]); } else if(choose==2) { printf("#\n"); srand(time(0)); for(i=0;i<150;i++) Auto[i]=rand()%200; printf("#\n"); start=clock(); for(i=74;i>=0;i--) { for(;i*2+1<150;i=ch) { ch=i*2+1; if(ch+1<150&&Auto[ch+1]>Auto[ch]) ch++; if(Auto[i]<Auto[ch]) { t=Auto[i]; Auto[i]=Auto[ch]; Auto[ch]=t; } } } printf("#\n"); //HAd1(ma,i,1500); for(i=149;i>0;--i) { t=ma[0]; ma[0]=ma[i]; ma[i]=t; HAd1(ma,0,i); } end=clock(); printf("所花时间为%d\n",end-start); } printf("\n退回主菜单\n"); } int mpt(int beg,int end) { if(path[beg][end]>=0) { mpt(beg,path[beg][end],path); mpt(path[beg][end],end,path); } else printf("->%s",end+97); } void s5() { int i,j,k,beg,end,x,choose,map[9][9]; char tale; srand(time(0)); for(i=0;i<10;i++) for(j=0;j<10;j++) map[i][j]=10; for(i=0;i<10;i++) for(j=0;j<10;j++) path[i][j]=-1; printf("\n进入最短路径问题\n"); printf("1.随机生成图(5个点权值1-9)\n"); printf("2.手动输入图\n"); printf("请选择:"); scanf("%d",&choose); if(choose==1) { for(i=0;i<5;i++) { for(j=0;j<5;j++) { if(rand()%9<3) map[i][j]=rand()%9+1; } map[i][i+1]=rand()%9+1; map[i][i]=0; } map[4][0]=rand()%9+1; } else if(choose==2) { x; } // for(i=0;i<5;i++) { for(j=0;j<5;j++) if(map[i][j]<10) printf("%d ",map[i][j]); else printf("x "); printf("\n"); } printf("#"); for(k=0;k<10;k++) for(i=0;i<10;i++) for(j=0;j<10;j++) { if(map[i][k]+map[k][j]<map[i][j]) { map[i][j]=map[i][k]+map[k][j]; path[i][j]=k; } } printf("\n请输入起点(小写字母):"); scanf("%s",&tale); beg=tale-97; printf("请输入终点(小写字母):"); scanf("%s",&tale); end=tale-97; printf("#"); x=map[beg][end]; tale=beg+97; printf("#"); printf("最短距离为%d,最短路径为:\n%s",x,tale); printf("#"); mpt(beg,end); } void main() { int k; printf("-------------------------\n"); printf(" 《算法设计与分析》实验\n"); printf("-------------------------\n"); while(1) { printf("\n1. 算法分析基础——Fibonacci序列问题\n"); printf("2. 分治法在数值问题中的应用——矩阵相乘问题\n"); printf("3. 减治法在组合问题中的应用——8枚硬币问题\n"); printf("4. 变治法在排序问题中的应用——堆排序问题\n"); printf("5. 动态规划法在图问题中的应用——全源最短路径问题\n"); printf("99. 退出本实验\n"); printf("-------------------------\n"); printf("请输入您所要执行的操作(1,2,3,4,5,99):"); scanf("%d",&k); switch(k) { case 1: s1(); break; case 2: s2(); break; case 3: s3(); break; case 4: s4(); break; case 5: s5(); break; case 99: exit(0); default: exit(1); } } }
#include<stdio.h> #include<stdlib.h> #include<time.h> int path[9][9]; int s1() { int choose,n,i; long result,start,end,a=0,b=1,c; printf("\n进入Fibonacci序列问题\n"); printf("1.用两种方法分别求最大的n\n"); printf("2.输入n求Fibonacci数\n"); printf("请选择:"); scanf("%d",&choose); if(choose==1) { n=1; start=clock(); do { result=a+b; a=b; b=result; printf("第%d个Fibonacci数:%d\n",n,a); n++; }while(result>=a); end=clock(); printf("\n迭代求得最大的n为%d,用时%d毫秒\n",n-1,end-start); n=1,a=0,b=1; start=clock(); n=F(a,b,n); end=clock(); printf("\n递归求得最大的n为%d,用时%d毫秒\n",n,end-start); } else if(choose==2) { printf("\n请输入一个整数n:"); scanf("%d",&n); if(n<0) printf("请输入正数!"); else if(n>0&&n<3) printf("Fibonacci(%d)=1\n",n); else if(n>2) { for(i=1;i<n;i++) { result=a+b; a=b; b=result; } printf("Fibonacci(%d)=%d\n",n,result); } } printf("\n退出并返回主菜单\n\n"); } int F(int a,int b,int n) { if((a+b)<b) { return n; } else { printf("第%d个Fibonacci数:%d\n",n,b); F(b,a+b,n+1); } } void s2() { int n,choose,i,j,k,a[10][10],b[10][10],c[10][10]; printf("\n进入矩阵相乘问题\n"); printf("请输入需要计算的矩阵阶数(10以内):"); scanf("%d",&n); if(n<=0) printf("请输入正数!"); else if(n>0) { printf("\n1.随机生成矩阵数据\n"); printf("2.手动输入矩阵数据\n"); printf("请选择:"); scanf("%d",&choose); if(choose==1) { srand(time(0)); for(i=0;i<n;i++) for(j=0;j<n;j++) a[i][j]=rand()%10; for(i=0;i<n;i++) for(j=0;j<n;j++) b[i][j]=rand()%10; } else if(choose==2) { for(i=0;i<n;i++) for(j=0;j<n;j++) { printf("a矩阵第%d行第%d列:"); scanf("%d",&a[i][j]); } for(i=0;i<n;i++) for(j=0;j<n;j++) { printf("b矩阵第%d行第%d列:"); scanf("%d",&b[i][j]); } } //输出当前两个矩阵 printf("\na矩阵:\n"); for(i=0;i<n;i++) { for(j=0;j<n;j++) printf("%d ",a[i][j]); printf("\n"); } printf("\nb矩阵:\n"); for(i=0;i<n;i++) { for(j=0;j<n;j++) printf("%d ",b[i][j]); printf("\n"); } //选择算法 printf("\n1.蛮力法计算\n"); printf("2.分治法计算\n"); printf("请选择:"); scanf("%d",&choose); if(choose==1) { for(i=0;i<n;i++) for(j=0;j<n;j++) c[i][j]=0; for(i=0;i<n;i++) for(j=0;j<n;j++) { for(k=0;k<n;k++) c[i][j]=c[i][j]+a[i][k]*b[k][j]; } printf("\n结果矩阵:\n"); for(i=0;i<n;i++) { for(j=0;j<n;j++) printf("%-5d",c[i][j]); printf("\n"); } } else if(choose==2) {} } printf("\n退出并返回主菜单\n\n"); } void s3() { int i,x,choose,c[7]; printf("\n进入8枚硬币问题\n"); printf("1.随机生成假币\n"); printf("2.手动输入假币编号(1-8)\n"); printf("请选择:"); scanf("%d",&choose); if(choose==1) { srand(time(0)); x=rand()%7+1; } else if(choose==2) { scanf("%d",&x); } for(i=0;i<7;i++) c[i]=1; c[x-1]=2; if((c[0]+c[2]+c[4])==(c[1]+c[3]+c[5])) { printf("1、3、5号硬币和2、4、6号硬币一样重\n"); if(c[6]==c[4]) { printf("7号硬币和5号硬币一样重\n"); printf("8号硬币是假币\n"); } else { printf("7号硬币和5号硬币不一样重\n"); printf("7号硬币是假币\n"); } } else { printf("1、3、5号硬币和2、4、6号硬币不一样重\n"); if((c[0]+c[2])==(c[1]+c[3])) { printf("1、3号硬币和2、4号硬币一样重\n"); if(c[4]==c[2]) { printf("5号硬币和3号硬币一样重\n"); printf("6号硬币是假币\n"); } else { printf("5号硬币和3号硬币不一样重\n"); printf("5号硬币是假币\n"); } } else { printf("1、3号硬币和2、4号硬币不一样重\n"); if(c[0]==c[1]) { printf("1号硬币和2号硬币一样重\n"); if(c[0]==c[2]) { printf("1号硬币和3号硬币一样重\n"); printf("4号硬币是假币\n"); } else { printf("1号硬币和3号硬币不一样重\n"); printf("3号硬币是假币\n"); } } else { printf("1号硬币和2号硬币不一样重\n"); if(c[0]==c[2]) { printf("1号硬币和3号硬币一样重\n"); printf("2号硬币是假币\n"); } else { printf("1号硬币和3号硬币不一样重\n"); printf("1号硬币是假币\n"); } } } } } void HAd1(int a[],int i,int nLength) { int Child; int nTemp; for(;2*i+1<nLength;i=Child) { Child=2*i+1; if(Child<nLength-1&&a[Child+1]>a[Child]) Child++; if(a[i]<a[Child]) { nTemp=a[i]; a[i]=a[Child]; a[Child]=nTemp; } } } /*void kkk() { int a,b,c[2000]; c[0]=b+a; printf("#\n"); for(a=0;a<2000;a++) if(b) c[a]=++b; }*/ void s4() { int i,t,ch,choose,ma[9]; long start,end; short Auto[1500]; //for(i=2000;i>=0;i--) //kkk(); printf("\n进入堆排序问题\n"); printf("1.手动输入检测可用性(10个数据)\n"); printf("2.随机生成2000个数据检测时间效率\n"); printf("请选择:"); scanf("%d",&choose); if(choose==1) { printf("每次回车输入一个数据:\n"); for(i=0;i<10;i++) scanf("%d",&ma[i]); for(i=4;i>=0;i--) HAd1(ma,i,10); for(i=8;i>0;--i) { t=ma[0]; ma[0]=ma[i]; ma[i]=t; HAd1(ma,0,i); } printf("排序结果:\n"); for(i=0;i<10;i++) printf("%d ",ma[i]); } else if(choose==2) { printf("#\n"); srand(time(0)); for(i=0;i<150;i++) Auto[i]=rand()%200; printf("#\n"); start=clock(); for(i=74;i>=0;i--) { for(;i*2+1<150;i=ch) { ch=i*2+1; if(ch+1<150&&Auto[ch+1]>Auto[ch]) ch++; if(Auto[i]<Auto[ch]) { t=Auto[i]; Auto[i]=Auto[ch]; Auto[ch]=t; } } } printf("#\n"); //HAd1(ma,i,1500); for(i=149;i>0;--i) { t=ma[0]; ma[0]=ma[i]; ma[i]=t; HAd1(ma,0,i); } end=clock(); printf("所花时间为%d\n",end-start); } printf("\n退回主菜单\n"); } int mpt(int beg,int end) { if(path[beg][end]>=0) { mpt(beg,path[beg][end],path); mpt(path[beg][end],end,path); } else printf("->%s",end+97); } void s5() { int i,j,k,beg,end,x,choose,map[9][9]; char tale; srand(time(0)); for(i=0;i<10;i++) for(j=0;j<10;j++) map[i][j]=10; for(i=0;i<10;i++) for(j=0;j<10;j++) path[i][j]=-1; printf("\n进入最短路径问题\n"); printf("1.随机生成图(5个点权值1-9)\n"); printf("2.手动输入图\n"); printf("请选择:"); scanf("%d",&choose); if(choose==1) { for(i=0;i<5;i++) { for(j=0;j<5;j++) { if(rand()%9<3) map[i][j]=rand()%9+1; } map[i][i+1]=rand()%9+1; map[i][i]=0; } map[4][0]=rand()%9+1; } else if(choose==2) { x; } // for(i=0;i<5;i++) { for(j=0;j<5;j++) if(map[i][j]<10) printf("%d ",map[i][j]); else printf("x "); printf("\n"); } printf("#"); for(k=0;k<10;k++) for(i=0;i<10;i++) for(j=0;j<10;j++) { if(map[i][k]+map[k][j]<map[i][j]) { map[i][j]=map[i][k]+map[k][j]; path[i][j]=k; } } printf("\n请输入起点(小写字母):"); scanf("%s",&tale); beg=tale-97; printf("请输入终点(小写字母):"); scanf("%s",&tale); end=tale-97; printf("#"); x=map[beg][end]; tale=beg+97; printf("#"); printf("最短距离为%d,最短路径为:\n%s",x,tale); printf("#"); mpt(beg,end); } void main() { int k; printf("-------------------------\n"); printf(" 《算法设计与分析》实验\n"); printf("-------------------------\n"); while(1) { printf("\n1. 算法分析基础——Fibonacci序列问题\n"); printf("2. 分治法在数值问题中的应用——矩阵相乘问题\n"); printf("3. 减治法在组合问题中的应用——8枚硬币问题\n"); printf("4. 变治法在排序问题中的应用——堆排序问题\n"); printf("5. 动态规划法在图问题中的应用——全源最短路径问题\n"); printf("99. 退出本实验\n"); printf("-------------------------\n"); printf("请输入您所要执行的操作(1,2,3,4,5,99):"); scanf("%d",&k); switch(k) { case 1: s1(); break; case 2: s2(); break; case 3: s3(); break; case 4: s4(); break; case 5: s5(); break; case 99: exit(0); default: exit(1); } } }
相关文章推荐
- oracle中提高order by的性能
- 老李分享:《Java Performance》笔记1——性能分析基础 2
- 最短路径算法介绍(转载)floyd+dijkstra
- 【NOI2015】BZOJ4195程序自动分析(并查集+离散化)
- 老李分享:《Java Performance》笔记1——性能分析基础 1
- DecimalFormat精度解决,商业运算精度问题
- 单点登录与消息队列以及在J2EE中的实现方案
- Java多线程总结(4)— 线程范围内数据操作的隔离及ThreadLocal类
- struts2_04 常见servlet对象的获取,文件上传
- Handler
- 《需求分析与系统设计》阅读笔记二
- yum只下载而不安装软件包?
- DB2 添加新分区到分区组(DATABASE PARTITION GROUP)后,数据并未分布
- 移动端界面设计——尺寸
- jquery 只能输入数字和小数
- 正则表达式—叠词
- Centos7利用光盘制作YUM源
- uboot启动流程webee210启动第一阶段state_one
- struts2_03 自定义类型转换器 拦截器
- lazyload.js详解