试验一

  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("
进入Fibonacci序列问题
");
 11     printf("1.用两种方法分别求最大的n
");
 12     printf("2.输入n求Fibonacci数
");
 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,a);
 25             n++;
 26         }while(result>=a);
 27         end=clock();
 28         printf("
迭代求得最大的n为%d,用时%d毫秒
",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为%d,用时%d毫秒
",n,end-start);
 35     }
 36     else if(choose==2)
 37     {
 38         printf("
请输入一个整数n:");
 39         scanf("%d",&n);
 40         if(n<0)
 41             printf("请输入正数!");
 42         else if(n>0&&n<3)
 43             printf("Fibonacci(%d)=1
",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,result);
 53         }
 54     }
 55     printf("
退出并返回主菜单

");
 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,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("
进入矩阵相乘问题
");
 75     printf("请输入需要计算的矩阵阶数(10以内):");
 76     scanf("%d",&n);
 77     if(n<=0)
 78         printf("请输入正数!");
 79     else if(n>0)
 80     {
 81         printf("
1.随机生成矩阵数据
");
 82         printf("2.手动输入矩阵数据
");
 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("
a矩阵:
");
112         for(i=0;i<n;i++)
113         {
114             for(j=0;j<n;j++)
115                 printf("%d ",a[i][j]);
116             printf("
");
117         }        
118         printf("
b矩阵:
");
119         for(i=0;i<n;i++)
120         {
121             for(j=0;j<n;j++)
122                 printf("%d ",b[i][j]);
123             printf("
");
124         }        
125         //选择算法
126         printf("
1.蛮力法计算
");
127         printf("2.分治法计算
");
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("
结果矩阵:
");        
142             for(i=0;i<n;i++)
143             {
144                 for(j=0;j<n;j++)
145                     printf("%-5d",c[i][j]);
146                 printf("
");
147             }        
148         }
149         else if(choose==2)
150         {}
151         
152     }
153     printf("
退出并返回主菜单

");
154 }
155 
156 void s3()
157 {
158     int i,x,choose,c[7];
159     printf("
进入8枚硬币问题
");
160     printf("1.随机生成假币
");
161     printf("2.手动输入假币编号(1-8)
");
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号硬币一样重
");
182         if(c[6]==c[4])
183         {
184             printf("7号硬币和5号硬币一样重
");
185             printf("8号硬币是假币
");
186         }
187         else
188         {
189             printf("7号硬币和5号硬币不一样重
");
190             printf("7号硬币是假币
");
191         }
192     }
193     else
194     {
195         printf("1、3、5号硬币和2、4、6号硬币不一样重
");
196         if((c[0]+c[2])==(c[1]+c[3]))
197         {
198             printf("1、3号硬币和2、4号硬币一样重
");
199             if(c[4]==c[2])
200             {
201                 printf("5号硬币和3号硬币一样重
");
202                 printf("6号硬币是假币
");
203             }
204             else
205             {
206                 printf("5号硬币和3号硬币不一样重
");
207                 printf("5号硬币是假币
");
208             }
209         }
210         else
211         {
212             printf("1、3号硬币和2、4号硬币不一样重
");
213             if(c[0]==c[1])
214             {
215                 printf("1号硬币和2号硬币一样重
");
216                 if(c[0]==c[2])
217                 {
218                     printf("1号硬币和3号硬币一样重
");
219                     printf("4号硬币是假币
");
220                 }
221                 else
222                 {
223                     printf("1号硬币和3号硬币不一样重
");
224                     printf("3号硬币是假币
");
225                 }
226             }
227             else
228             {
229                 printf("1号硬币和2号硬币不一样重
");
230                 if(c[0]==c[2])
231                 {
232                     printf("1号硬币和3号硬币一样重
");
233                     printf("2号硬币是假币
");
234                 }
235                 else
236                 {
237                     printf("1号硬币和3号硬币不一样重
");
238                     printf("1号硬币是假币
");
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("#
");
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("
进入堆排序问题
");
287     printf("1.手动输入检测可用性(10个数据)
");
288     printf("2.随机生成2000个数据检测时间效率
");
289     printf("请选择:");
290     scanf("%d",&choose);
291     if(choose==1)
292     {
293         printf("每次回车输入一个数据:
");
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("排序结果:
");
306         for(i=0;i<10;i++)
307             printf("%d ",ma[i]);
308         
309     }
310     else if(choose==2)
311     {
312         printf("#
");
313         srand(time(0));
314 
315         for(i=0;i<150;i++)
316             Auto[i]=rand()%200;
317 
318         printf("#
");
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("#
");
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
",end-start);
350     }
351     printf("
退回主菜单
");
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("
进入最短路径问题
");
379     printf("1.随机生成图(5个点权值1-9)
");
380     printf("2.手动输入图
");
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("
");
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("
请输入起点(小写字母):");
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,最短路径为:
%s",x,tale);
434         printf("#");
435     mpt(beg,end);
436 }
437 
438 void main()
439 {
440     int k;
441     printf("-------------------------
");
442     printf("              《算法设计与分析》实验
");
443     printf("-------------------------
");
444     while(1)
445     {
446         
447         printf("
1.    算法分析基础——Fibonacci序列问题
");
448         printf("2.    分治法在数值问题中的应用——矩阵相乘问题
");
449         printf("3.    减治法在组合问题中的应用——8枚硬币问题
");
450         printf("4.    变治法在排序问题中的应用——堆排序问题
");
451         printf("5.    动态规划法在图问题中的应用——全源最短路径问题
");
452         printf("99.   退出本实验
");
453         printf("-------------------------
");
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("
进入Fibonacci序列问题
");
    printf("1.用两种方法分别求最大的n
");
    printf("2.输入n求Fibonacci数
");
    printf("请选择:");
    scanf("%d",&choose);
    if(choose==1)
    {
        n=1;
        start=clock();
        do
        {
            result=a+b;
            a=b;
            b=result;
            printf("第%d个Fibonacci数:%d
",n,a);
            n++;
        }while(result>=a);
        end=clock();
        printf("
迭代求得最大的n为%d,用时%d毫秒
",n-1,end-start);

        n=1,a=0,b=1;
        start=clock();
        n=F(a,b,n);
        end=clock();
        printf("
递归求得最大的n为%d,用时%d毫秒
",n,end-start);
    }
    else if(choose==2)
    {
        printf("
请输入一个整数n:");
        scanf("%d",&n);
        if(n<0)
            printf("请输入正数!");
        else if(n>0&&n<3)
            printf("Fibonacci(%d)=1
",n);
        else if(n>2)
        {
            for(i=1;i<n;i++)
            {
                result=a+b;
                a=b;
                b=result;
            }
            printf("Fibonacci(%d)=%d
",n,result);
        }
    }
    printf("
退出并返回主菜单

");
}

int F(int a,int b,int n)
{
    if((a+b)<b)
    {
        return n;
    }
    else
    {
        printf("第%d个Fibonacci数:%d
",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("
进入矩阵相乘问题
");
    printf("请输入需要计算的矩阵阶数(10以内):");
    scanf("%d",&n);
    if(n<=0)
        printf("请输入正数!");
    else if(n>0)
    {
        printf("
1.随机生成矩阵数据
");
        printf("2.手动输入矩阵数据
");
        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("
a矩阵:
");
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
                printf("%d ",a[i][j]);
            printf("
");
        }        
        printf("
b矩阵:
");
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
                printf("%d ",b[i][j]);
            printf("
");
        }        
        //选择算法
        printf("
1.蛮力法计算
");
        printf("2.分治法计算
");
        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("
结果矩阵:
");        
            for(i=0;i<n;i++)
            {
                for(j=0;j<n;j++)
                    printf("%-5d",c[i][j]);
                printf("
");
            }        
        }
        else if(choose==2)
        {}
        
    }
    printf("
退出并返回主菜单

");
}

void s3()
{
    int i,x,choose,c[7];
    printf("
进入8枚硬币问题
");
    printf("1.随机生成假币
");
    printf("2.手动输入假币编号(1-8)
");
    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号硬币一样重
");
        if(c[6]==c[4])
        {
            printf("7号硬币和5号硬币一样重
");
            printf("8号硬币是假币
");
        }
        else
        {
            printf("7号硬币和5号硬币不一样重
");
            printf("7号硬币是假币
");
        }
    }
    else
    {
        printf("1、3、5号硬币和2、4、6号硬币不一样重
");
        if((c[0]+c[2])==(c[1]+c[3]))
        {
            printf("1、3号硬币和2、4号硬币一样重
");
            if(c[4]==c[2])
            {
                printf("5号硬币和3号硬币一样重
");
                printf("6号硬币是假币
");
            }
            else
            {
                printf("5号硬币和3号硬币不一样重
");
                printf("5号硬币是假币
");
            }
        }
        else
        {
            printf("1、3号硬币和2、4号硬币不一样重
");
            if(c[0]==c[1])
            {
                printf("1号硬币和2号硬币一样重
");
                if(c[0]==c[2])
                {
                    printf("1号硬币和3号硬币一样重
");
                    printf("4号硬币是假币
");
                }
                else
                {
                    printf("1号硬币和3号硬币不一样重
");
                    printf("3号硬币是假币
");
                }
            }
            else
            {
                printf("1号硬币和2号硬币不一样重
");
                if(c[0]==c[2])
                {
                    printf("1号硬币和3号硬币一样重
");
                    printf("2号硬币是假币
");
                }
                else
                {
                    printf("1号硬币和3号硬币不一样重
");
                    printf("1号硬币是假币
");
                }
            }
        }
    }
}

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("#
");
    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("
进入堆排序问题
");
    printf("1.手动输入检测可用性(10个数据)
");
    printf("2.随机生成2000个数据检测时间效率
");
    printf("请选择:");
    scanf("%d",&choose);
    if(choose==1)
    {
        printf("每次回车输入一个数据:
");
        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("排序结果:
");
        for(i=0;i<10;i++)
            printf("%d ",ma[i]);
        
    }
    else if(choose==2)
    {
        printf("#
");
        srand(time(0));

        for(i=0;i<150;i++)
            Auto[i]=rand()%200;

        printf("#
");
        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("#
");
            //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
",end-start);
    }
    printf("
退回主菜单
");
}

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("
进入最短路径问题
");
    printf("1.随机生成图(5个点权值1-9)
");
    printf("2.手动输入图
");
    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("
");
    }
    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("
请输入起点(小写字母):");
    scanf("%s",&tale);
    beg=tale-97;
    printf("请输入终点(小写字母):");
    scanf("%s",&tale);
    end=tale-97;
        printf("#");
    x=map[beg][end];
    tale=beg+97;
            printf("#");
    printf("最短距离为%d,最短路径为:
%s",x,tale);
        printf("#");
    mpt(beg,end);
}

void main()
{
    int k;
    printf("-------------------------
");
    printf("              《算法设计与分析》实验
");
    printf("-------------------------
");
    while(1)
    {
        
        printf("
1.    算法分析基础——Fibonacci序列问题
");
        printf("2.    分治法在数值问题中的应用——矩阵相乘问题
");
        printf("3.    减治法在组合问题中的应用——8枚硬币问题
");
        printf("4.    变治法在排序问题中的应用——堆排序问题
");
        printf("5.    动态规划法在图问题中的应用——全源最短路径问题
");
        printf("99.   退出本实验
");
        printf("-------------------------
");
        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);
        }

    }
}
原文地址:https://www.cnblogs.com/xs-yqz/p/5051566.html