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

任务代码:

问题1:

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

#include 
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 
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:

C语言:问题求解方法-穷举_第1张图片

#include 
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 
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 
#include 
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 
#include 
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 
#include 
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 
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;
}


执行情况:

C语言:问题求解方法-穷举_第2张图片C语言:问题求解方法-穷举_第3张图片

C语言:问题求解方法-穷举_第4张图片

C语言:问题求解方法-穷举_第5张图片

C语言:问题求解方法-穷举_第6张图片

C语言:问题求解方法-穷举_第7张图片

C语言:问题求解方法-穷举_第8张图片



知识总结:


心得体会:


你可能感兴趣的:(C语言初步学习)