WHCSRL 技术网

初学者之循环_m0

一:穷举法

例题:我国古代数学家张丘建在《算经》一书中曾提出过著名的“百钱买百鸡”问题,该问题叙述如下:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,则翁、母、雏各几何?

 意思是公鸡一个五块钱,母鸡一个三块钱,小鸡三个一块钱,现在要用一百块钱买一百只鸡,问公鸡、母鸡、小鸡各多少只)

计算机的计算速度是非常快的,我们可以让他暴力的计算出所有的可能并从中找到正确的可能。

我们可以先确定大概的框架—-

  1. #include <stdio.h>
  2. int main()
  3. {
  4. return 0;
  5. }

 首先可以确定的是,公鸡最多22只,母鸡33只,小鸡仔叁佰只;

而从这里我们可以得到大概的框架:

  1. int cocks,hens,chicks;
  2. for(cocks=0;cocks<=20;cocks++){
  3. for(hens=0;hens<=33;hens++){
  4. for(chicks=0;chicks<=300;chicks++){
  5. }
  6. }
  7. }

而其中相对应的单词所代表的数字代表的是所对应种类个数,最后的小鸡仔的个数就是100减去前面两种种类的个数;

然后我们确定我们所需要的——即百钱买百鸡

  1. if(5*cocks+3*hens+chicks/3.0==100)
  2. printf("cocks=%%d,hens=%%d,chicks=%%d ",cocks,hens,chicks);

运行结果如下:

 对于结果较多的穷举法,我们以可以在其中计入计数器:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int one,two,five;
  5. int x;
  6. printf("请输入x元");
  7. scanf("%%d",&x);
  8. int cnt=0;
  9. for(one=0;one<=100;one++){
  10. for(two=0;two<=50;two++){
  11. for(five=0;five<=20;five++){
  12. if(one*1+two*2+five*5==100*x){
  13. printf("%%d个一分%%d个两分和%%d个五分组成%%d元 ",one,two,five,x);
  14. cnt+=1;
  15. }
  16. }
  17. }
  18. }
  19. printf("%%d",cnt);
  20. return 0;
  21. }

 二:辗转相除法求最大公约数

(辗转相除法求最大公约数大家可以借鉴数学,不在c语言范畴内了^-^)

方法如下:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int a,b;
  5. scanf("%%d%%d",&a,&b);
  6. int c=0;
  7. while(b!=0){
  8. c=a%%b;
  9. a=b;
  10. b=c;
  11. }
  12. printf("%%d",a);
  13. }

当然也可以使用枚举法,更好理解但是复杂,不推荐使用

(从我看的网课截下来的)

推荐阅读