百钱买百鸡的三种做法 C语言.docxVIP

  • 97
  • 0
  • 约2.01千字
  • 约 3页
  • 2017-06-30 发布于河南
  • 举报
百钱买百鸡的三种做法 C语言

问题概述一百个铜钱买了一百只鸡,其中公鸡一只5钱、母鸡一只3钱,小鸡一钱3只,问一百只鸡中公鸡、母鸡、小鸡各多少)。这是一个古典数学问题,设一百只鸡中公鸡、母鸡、小鸡分别为x,y,z,问题化为三元一次方程组:这里x,y,z为正整数,且z是3的倍数;由于鸡和钱的总数都是100,可以确定x,y,z的取值范围:1) x的取值范围为1~202) y的取值范围为1~333) z的取值范围为3~99,步长为3对于这个问题我们可以用穷举的方法,遍历x,y,z的所有可能组合,最后得到问题的解。当然也可以简化算法去完成这个问题。数据要求问题中的常量:无问题的输入:无问题的输出:int x,y,z /*公鸡、母鸡、小鸡的只数*/三重循环做法(穷举法)#include stdio.h#include stdlib.h//由于笔者用的devc++编程,所以需要加system(pause);语句暂停程序int main(){inta,b,c; //a,b,c分别为公鸡母鸡还有小鸡的数量(均得到大致范围)printf(本程序用来解决百钱买百鸡的问题。\n);system(pause);for(a=0;a=15;a++)for(b=0;b=25;b++)for(c=66;c=100;c+=3) if(a+b+c==1005*a+3*b+c/3==100) //判断条件printf(分配:公鸡%d只,母鸡%d只,雏鸡%d只,为百钱买百鸡的答案。\n,a,b,c);system(pause);return 0;}//程序中的算法自己已经通过不买公鸡or母鸡的方法求得大约界限,缩小了循环的范围。 //程序错误:原来通过二元二次方程得到 for(c=66;c=75;c+=3),但那个是为了检测a和b的最大值,而不能用来恒定c。应该用c和最小的b去恒定- -//范围能缩小就缩小,但是要准确和肯定。- -二重循环做法(简化法)#include stdio.h#include stdlib.hint main(){inta,b,c; //a,b,c分别为公鸡母鸡还有小鸡的数量(均得到大致范围)printf(本程序用来解决百钱买百鸡的问题。\n);system(pause);for(a=0;a=15;a++)for(c=0;c=100;c+=3){b=100-a-c;if(5*a+3*b+c/3==100) //判断条件printf(分配:公鸡%d只,母鸡%d只,雏鸡%d只,为百钱买百鸡的答案。\n,a,b,c);}system(pause);return 0;}//将c作为二次循环条件而不是b,这样可以避免很多次c不是3的倍数的情况//b=100-a-c,从而判断条件中也不需要这一个条件了,只需要判定它们的价格是否为100即可一重循环做法(好方法- -)#include stdio.h#include stdlib.hint main(){inta,b,c,num,mon,i;//a,b分别为公鸡母鸡数量,c为雏鸡数量除以3printf(本程序用来解决百钱买百鸡的问题。\n);system(pause);for(c=0;c=33;c++) {num=100-3*c;mon=100-c; if((mon-3*num)%2==0) { a=(mon-3*num)/2;if(a0||a15) continue; b=num-a;if(b0||b25) continue; //通过两个条件分别判断a和b的值是否在指定区间(否则会产生负值和很大的值)printf(分配:公鸡%d只,母鸡%d只,雏鸡%d只,为百钱买百鸡的答案。\n,a,b,3*c); } } system(PAUSE);return 0; }其中一些数值为简要的缩减范围。。至于mon-3*num)%2==0则是通过一元二次方程得出,还是提前做了一些计算的。就相当于优化算法了。当然,这个问题还有很多种做法,希望一样热爱C语言的加油~由于本人只是初学两个月,多有浅薄的认识和不足,望见谅。

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档