任务代码:
问题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;
}
#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;
}
对于三位数字,若各位数字立方和等于该数,该数就是水仙花数。如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;
}
用一元人民币兑换成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;
}
执行情况:
知识总结:
心得体会: