1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<time.h>
4 int path[9][9];
5 int s1()
6 {
7 int choose,n,i;
8 long result,start,end,a=0,b=1,c;
9
10 printf("\n进入Fibonacci序列问题\n");
11 printf("1.用两种方法分别求最大的n\n");
12 printf("2.输入n求Fibonacci数\n");
13 printf("请选择:");
14 scanf("%d",&choose);
15 if(choose==1)
16 {
17 n=1;
18 start=clock();
19 do
20 {
21 result=a+b;
22 a=b;
23 b=result;
24 printf("第%d个Fibonacci数:%d\n",n,a);
25 n++;
26 }while(result>=a);
27 end=clock();
28 printf("\n迭代求得最大的n为%d,用时%d毫秒\n",n-1,end-start);
29
30 n=1,a=0,b=1;
31 start=clock();
32 n=F(a,b,n);
33 end=clock();
34 printf("\n递归求得最大的n为%d,用时%d毫秒\n",n,end-start);
35 }
36 else if(choose==2)
37 {
38 printf("\n请输入一个整数n:");
39 scanf("%d",&n);
40 if(n<0)
41 printf("请输入正数!");
42 else if(n>0&&n<3)
43 printf("Fibonacci(%d)=1\n",n);
44 else if(n>2)
45 {
46 for(i=1;i<n;i++)
47 {
48 result=a+b;
49 a=b;
50 b=result;
51 }
52 printf("Fibonacci(%d)=%d\n",n,result);
53 }
54 }
55 printf("\n退出并返回主菜单\n\n");
56 }
57
58 int F(int a,int b,int n)
59 {
60 if((a+b)<b)
61 {
62 return n;
63 }
64 else
65 {
66 printf("第%d个Fibonacci数:%d\n",n,b);
67 F(b,a+b,n+1);
68 }
69 }
70
71 void s2()
72 {
73 int n,choose,i,j,k,a[10][10],b[10][10],c[10][10];
74 printf("\n进入矩阵相乘问题\n");
75 printf("请输入需要计算的矩阵阶数(10以内):");
76 scanf("%d",&n);
77 if(n<=0)
78 printf("请输入正数!");
79 else if(n>0)
80 {
81 printf("\n1.随机生成矩阵数据\n");
82 printf("2.手动输入矩阵数据\n");
83 printf("请选择:");
84 scanf("%d",&choose);
85 if(choose==1)
86 {
87 srand(time(0));
88 for(i=0;i<n;i++)
89 for(j=0;j<n;j++)
90 a[i][j]=rand()%10;
91 for(i=0;i<n;i++)
92 for(j=0;j<n;j++)
93 b[i][j]=rand()%10;
94 }
95 else if(choose==2)
96 {
97 for(i=0;i<n;i++)
98 for(j=0;j<n;j++)
99 {
100 printf("a矩阵第%d行第%d列:");
101 scanf("%d",&a[i][j]);
102 }
103 for(i=0;i<n;i++)
104 for(j=0;j<n;j++)
105 {
106 printf("b矩阵第%d行第%d列:");
107 scanf("%d",&b[i][j]);
108 }
109 }
110 //输出当前两个矩阵
111 printf("\na矩阵:\n");
112 for(i=0;i<n;i++)
113 {
114 for(j=0;j<n;j++)
115 printf("%d ",a[i][j]);
116 printf("\n");
117 }
118 printf("\nb矩阵:\n");
119 for(i=0;i<n;i++)
120 {
121 for(j=0;j<n;j++)
122 printf("%d ",b[i][j]);
123 printf("\n");
124 }
125 //选择算法
126 printf("\n1.蛮力法计算\n");
127 printf("2.分治法计算\n");
128 printf("请选择:");
129 scanf("%d",&choose);
130 if(choose==1)
131 {
132 for(i=0;i<n;i++)
133 for(j=0;j<n;j++)
134 c[i][j]=0;
135 for(i=0;i<n;i++)
136 for(j=0;j<n;j++)
137 {
138 for(k=0;k<n;k++)
139 c[i][j]=c[i][j]+a[i][k]*b[k][j];
140 }
141 printf("\n结果矩阵:\n");
142 for(i=0;i<n;i++)
143 {
144 for(j=0;j<n;j++)
145 printf("%-5d",c[i][j]);
146 printf("\n");
147 }
148 }
149 else if(choose==2)
150 {}
151
152 }
153 printf("\n退出并返回主菜单\n\n");
154 }
155
156 void s3()
157 {
158 int i,x,choose,c[7];
159 printf("\n进入8枚硬币问题\n");
160 printf("1.随机生成假币\n");
161 printf("2.手动输入假币编号(1-8)\n");
162 printf("请选择:");
163 scanf("%d",&choose);
164 if(choose==1)
165 {
166 srand(time(0));
167 x=rand()%7+1;
168 }
169 else if(choose==2)
170 {
171 scanf("%d",&x);
172
173 }
174
175 for(i=0;i<7;i++)
176 c[i]=1;
177 c[x-1]=2;
178
179 if((c[0]+c[2]+c[4])==(c[1]+c[3]+c[5]))
180 {
181 printf("1、3、5号硬币和2、4、6号硬币一样重\n");
182 if(c[6]==c[4])
183 {
184 printf("7号硬币和5号硬币一样重\n");
185 printf("8号硬币是假币\n");
186 }
187 else
188 {
189 printf("7号硬币和5号硬币不一样重\n");
190 printf("7号硬币是假币\n");
191 }
192 }
193 else
194 {
195 printf("1、3、5号硬币和2、4、6号硬币不一样重\n");
196 if((c[0]+c[2])==(c[1]+c[3]))
197 {
198 printf("1、3号硬币和2、4号硬币一样重\n");
199 if(c[4]==c[2])
200 {
201 printf("5号硬币和3号硬币一样重\n");
202 printf("6号硬币是假币\n");
203 }
204 else
205 {
206 printf("5号硬币和3号硬币不一样重\n");
207 printf("5号硬币是假币\n");
208 }
209 }
210 else
211 {
212 printf("1、3号硬币和2、4号硬币不一样重\n");
213 if(c[0]==c[1])
214 {
215 printf("1号硬币和2号硬币一样重\n");
216 if(c[0]==c[2])
217 {
218 printf("1号硬币和3号硬币一样重\n");
219 printf("4号硬币是假币\n");
220 }
221 else
222 {
223 printf("1号硬币和3号硬币不一样重\n");
224 printf("3号硬币是假币\n");
225 }
226 }
227 else
228 {
229 printf("1号硬币和2号硬币不一样重\n");
230 if(c[0]==c[2])
231 {
232 printf("1号硬币和3号硬币一样重\n");
233 printf("2号硬币是假币\n");
234 }
235 else
236 {
237 printf("1号硬币和3号硬币不一样重\n");
238 printf("1号硬币是假币\n");
239 }
240 }
241 }
242 }
243 }
244
245 void HAd1(int a[],int i,int nLength)
246 {
247 int Child;
248 int nTemp;
249 for(;2*i+1<nLength;i=Child)
250 {
251
252 Child=2*i+1;
253
254 if(Child<nLength-1&&a[Child+1]>a[Child])
255 Child++;
256
257 if(a[i]<a[Child])
258 {
259 nTemp=a[i];
260 a[i]=a[Child];
261 a[Child]=nTemp;
262 }
263 }
264 }
265
266
267 /*void kkk()
268 {
269 int a,b,c[2000];
270 c[0]=b+a;
271 printf("#\n");
272 for(a=0;a<2000;a++)
273 if(b)
274 c[a]=++b;
275 }*/
276
277 void s4()
278 {
279 int i,t,ch,choose,ma[9];
280 long start,end;
281 short Auto[1500];
282
283 //for(i=2000;i>=0;i--)
284 //kkk();
285
286 printf("\n进入堆排序问题\n");
287 printf("1.手动输入检测可用性(10个数据)\n");
288 printf("2.随机生成2000个数据检测时间效率\n");
289 printf("请选择:");
290 scanf("%d",&choose);
291 if(choose==1)
292 {
293 printf("每次回车输入一个数据:\n");
294 for(i=0;i<10;i++)
295 scanf("%d",&ma[i]);
296 for(i=4;i>=0;i--)
297 HAd1(ma,i,10);
298 for(i=8;i>0;--i)
299 {
300 t=ma[0];
301 ma[0]=ma[i];
302 ma[i]=t;
303 HAd1(ma,0,i);
304 }
305 printf("排序结果:\n");
306 for(i=0;i<10;i++)
307 printf("%d ",ma[i]);
308
309 }
310 else if(choose==2)
311 {
312 printf("#\n");
313 srand(time(0));
314
315 for(i=0;i<150;i++)
316 Auto[i]=rand()%200;
317
318 printf("#\n");
319 start=clock();
320
321
322 for(i=74;i>=0;i--)
323 {
324 for(;i*2+1<150;i=ch)
325 {
326 ch=i*2+1;
327 if(ch+1<150&&Auto[ch+1]>Auto[ch])
328 ch++;
329 if(Auto[i]<Auto[ch])
330 {
331 t=Auto[i];
332 Auto[i]=Auto[ch];
333 Auto[ch]=t;
334 }
335 }
336 }
337 printf("#\n");
338 //HAd1(ma,i,1500);
339 for(i=149;i>0;--i)
340 {
341 t=ma[0];
342 ma[0]=ma[i];
343 ma[i]=t;
344 HAd1(ma,0,i);
345 }
346
347 end=clock();
348
349 printf("所花时间为%d\n",end-start);
350 }
351 printf("\n退回主菜单\n");
352 }
353
354 int mpt(int beg,int end)
355 {
356 if(path[beg][end]>=0)
357 {
358 mpt(beg,path[beg][end],path);
359 mpt(path[beg][end],end,path);
360 }
361 else
362 printf("->%s",end+97);
363 }
364
365 void s5()
366 {
367 int i,j,k,beg,end,x,choose,map[9][9];
368 char tale;
369 srand(time(0));
370
371 for(i=0;i<10;i++)
372 for(j=0;j<10;j++)
373 map[i][j]=10;
374 for(i=0;i<10;i++)
375 for(j=0;j<10;j++)
376 path[i][j]=-1;
377
378 printf("\n进入最短路径问题\n");
379 printf("1.随机生成图(5个点权值1-9)\n");
380 printf("2.手动输入图\n");
381 printf("请选择:");
382 scanf("%d",&choose);
383
384 if(choose==1)
385 {
386 for(i=0;i<5;i++)
387 {
388 for(j=0;j<5;j++)
389 {
390 if(rand()%9<3)
391 map[i][j]=rand()%9+1;
392 }
393 map[i][i+1]=rand()%9+1;
394 map[i][i]=0;
395 }
396 map[4][0]=rand()%9+1;
397 }
398 else if(choose==2)
399 {
400 x;
401 }
402 //
403 for(i=0;i<5;i++)
404 {
405 for(j=0;j<5;j++)
406 if(map[i][j]<10)
407 printf("%d ",map[i][j]);
408 else
409 printf("x ");
410 printf("\n");
411 }
412 printf("#");
413 for(k=0;k<10;k++)
414 for(i=0;i<10;i++)
415 for(j=0;j<10;j++)
416 {
417 if(map[i][k]+map[k][j]<map[i][j])
418 {
419 map[i][j]=map[i][k]+map[k][j];
420 path[i][j]=k;
421 }
422 }
423 printf("\n请输入起点(小写字母):");
424 scanf("%s",&tale);
425 beg=tale-97;
426 printf("请输入终点(小写字母):");
427 scanf("%s",&tale);
428 end=tale-97;
429 printf("#");
430 x=map[beg][end];
431 tale=beg+97;
432 printf("#");
433 printf("最短距离为%d,最短路径为:\n%s",x,tale);
434 printf("#");
435 mpt(beg,end);
436 }
437
438 void main()
439 {
440 int k;
441 printf("-------------------------\n");
442 printf(" 《算法设计与分析》实验\n");
443 printf("-------------------------\n");
444 while(1)
445 {
446
447 printf("\n1. 算法分析基础——Fibonacci序列问题\n");
448 printf("2. 分治法在数值问题中的应用——矩阵相乘问题\n");
449 printf("3. 减治法在组合问题中的应用——8枚硬币问题\n");
450 printf("4. 变治法在排序问题中的应用——堆排序问题\n");
451 printf("5. 动态规划法在图问题中的应用——全源最短路径问题\n");
452 printf("99. 退出本实验\n");
453 printf("-------------------------\n");
454 printf("请输入您所要执行的操作(1,2,3,4,5,99):");
455
456 scanf("%d",&k);
457 switch(k)
458 {
459 case 1:
460 s1();
461 break;
462 case 2:
463 s2();
464 break;
465 case 3:
466 s3();
467 break;
468 case 4:
469 s4();
470 break;
471 case 5:
472 s5();
473 break;
474 case 99:
475 exit(0);
476 default:
477 exit(1);
478 }
479
480 }
481 }
#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);
}
}
}