C语言:问题求解方法-穷举

来源:互联网 发布:js点击登录弹出登录框 编辑:程序博客网 时间:2024/05/19 00:48

任务代码:

问题1:

传统求解穷举方法(局限性:计算次数太多,程序运行耗时总共计算21*34*301次)

#include <stdio.h>int main(){    printf("解决问题:公鸡5元一只,母鸡3元一只,小鸡1元三只,问100元买100只鸡能买公鸡,母鸡,小鸡多少?(提供所有方案)\n\n");    int cock,hen,chick;    float price;    for(cock=0;cock<=20;cock++)//公鸡最多能有20只    {        for(hen=0;hen<=33;hen++)//母鸡最多有33只        {            for(chick=0;chick<=100;chick++)//小鸡最多100只                {                   if(cock*5+hen*3+chick/3==100&&cock+hen+chick==100&&chick%3==0)//小鸡1/3元一只且要被3除尽,小鸡只能以3只3只的买,也就是说钱最小单位1元不可能有1/3元!!!                   { printf("公鸡:%d 母鸡:%d 小鸡:%d\n",cock,hen,chick);}                }        }    }    return 0;}
问题改进:

#include <stdio.h>int main(){    printf("解决问题:公鸡5元一只,母鸡3元一只,小鸡1元三只,问100元买100只鸡能买公鸡,母鸡,小鸡多少?(提供所有方案)\n\n");    int cock,hen,chick;    float price;    for(cock=0;cock<=20;cock++)//公鸡最多能有20只    {        for(hen=0;hen<=33;hen++)//母鸡最多有33只        {             chick=100-cock-hen;//简化小鸡的计算循环                   if(cock*5+hen*3+chick/3==100 && chick%3==0)//小鸡1/3元一只且要被3除尽,小鸡只能以3只3只的买,也就是说钱最小单位1元不可能有1/3元!!!                   { printf("公鸡:%d 母鸡:%d 小鸡:%d\n",cock,hen,chick);}        }    }    return 0;}


问题2:

#include <stdio.h>int main(){    int a,b,c,d,e,f;//令1代表去,0代表不去    for(a=1;a>=0;a--)    {        for(b=1;b>=0;b--)        {            for(c=1;c>=0;c--)            {                for(d=1;d>=0;d--)                {                    for(e=1;e>=0;e--)                    {                        for(f=1;f>=0;f--)                        {                           if(a+b>=1 && (a+d)!=2 && a+e+f==2 && (b+c==0||b+c==2) && c+d==1 && (d+e==0||d==1) )                              {                                  printf("a:%d\n",a);                                  printf("b:%d\n",b);                                  printf("c:%d\n",c);                                  printf("d:%d\n",d);                                  printf("e:%d\n",e);                                  printf("f:%d\n",f);                              }                        }                    }                }            }        }    }    return 0;}

实践问题:

问题1:

小明有五本新书,要借给A,B,C三位小朋友,若每人每次只能借一本,则可以有多少种不同的借法?
提示:本问题实际上是一个排列问题,即求从5个中取3个进行排列的方法的总数。首先对五本书从1至5进行编号,然后使用穷举的方法。假设三个人分别借这五本书中的一本,当三个人所借的书的编号都不相同时,就是满足题意的一种借阅方法。

#include <stdio.h>int main(){int A,B,C;//代表三个学生int count=0 ;//代表第几种方案for(A=1;A<=5;A++)//将书籍从1-5标号{    for(B=1;B<=5;B++)    {        for(C=1;C<=5;C++)        {            if(A!=B&&B!=C&&C!=A)//判断三个人借的书是否不同,(a-b)*(b-c)*(c-a)!=0更好            {                count++;                printf("第%d种方案:",count);                printf("A借%d号书, B借%d号书, C借%d号书. ",A,B,C);                printf("\n");            }        }    }}return 0;}

问题2:

对于三位数字,若各位数字立方和等于该数,该数就是水仙花数。如153:153=1^3+5^3+3^3

#include <stdio.h>#include <math.h>int main(){    int iNumber,a,b,c;//a,b,c分别代表输入数字的个位,十位,百位    printf("三位数中的水性花数有:\n");    for(iNumber=100;iNumber<1000;iNumber++)    {       a=iNumber%10;  //取出个位       b=(iNumber/10)%10; //取出十位       c=iNumber/100;//取出百位       if(pow(a,3)+pow(b,3)+pow(c,3)==iNumber)       {            printf("%d\n",iNumber);       }    }    return 0;}

问题3:鸡兔共笼

鸡兔共有30只,脚共有90只,问鸡兔各有多少?

#include <stdio.h>#include <math.h>int main(){    int chick_number,bunny_number;    for(chick_number=0;chick_number<=30;chick_number++)    {        for(bunny_number=0;bunny_number<=30;bunny_number++)        {            if(chick_number+bunny_number==30 && 2*chick_number+4*bunny_number==90)            {                printf("鸡有%d只,兔子有%d\n",chick_number,bunny_number);            }        }    }    return 0;}

问题4:

用一元人民币兑换成1分、2分和5分硬币,有多少种不同的兑换方法?请输出所有可能的方案。
提示:根据题意设i,j,k分别为兑换的1分、2分、5分硬币的枚数,则i,j,k的值应满足:i+j*2+k*5=100,根据取值范围构造循环解题即可。

#include <stdio.h>#include <math.h>int main(){int i,j,k,count=0;//i代表1分,j代表2分,k代表5分;for(i=0;i<=100;i++){    for(j=0;j<=50;j++)    {        for(k=0;k<=20;k++)        {            if(i+j*2+k*5==100)            {                ++count;                  printf("%d 个1,%d个2,%d个5\n",i,j,k);                   if(count%50==0)   //每输出50个方案暂停一次                    {                        printf("按任意键继续输出……\n");                        getchar();                    }            }        }    }}return 0;}
问题5:

张三、李四、王五、刘六的年龄成一等差数列,他们四人的年龄相加是26,相乘是880,求以他们的年龄为前4项的等差数列的前20项。

#include <stdio.h>int main(){    int a,n,i,s;    for(a=1; a<=4; a++) //这个只能通过不断试验枚举确定范围        for(n=1; n<=6; n++)            if(n*4+a*6==26 && n*(n+a)*(n+a+a)*(n+a+a+a)==880)            {                printf("%d", n);  //输出第1个                for(i=1; i<20; i++)                {                    s=n+a*i;                    printf(", %d", s);  //后面的19个都和前一个用逗号分隔输出                }                printf("\n");            }    return 0;}


执行情况:









知识总结:


心得体会:


原创粉丝点击