您的位置:首页 > 其它

试验一

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);
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: