初学者之循环_m0
一:穷举法
例题:我国古代数学家张丘建在《算经》一书中曾提出过著名的“百钱买百鸡”问题,该问题叙述如下:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,则翁、母、雏各几何?(
意思是公鸡一个五块钱,母鸡一个三块钱,小鸡三个一块钱,现在要用一百块钱买一百只鸡,问公鸡、母鸡、小鸡各多少只)
计算机的计算速度是非常快的,我们可以让他暴力的计算出所有的可能并从中找到正确的可能。
我们可以先确定大概的框架—-
-
- #include <stdio.h>
- int main()
- {
-
- return 0;
- }
-
-
首先可以确定的是,公鸡最多22只,母鸡33只,小鸡仔叁佰只;
而从这里我们可以得到大概的框架:
-
- int cocks,hens,chicks;
- for(cocks=0;cocks<=20;cocks++){
- for(hens=0;hens<=33;hens++){
- for(chicks=0;chicks<=300;chicks++){
-
- }
- }
- }
-
-
而其中相对应的单词所代表的数字代表的是所对应种类个数,最后的小鸡仔的个数就是100减去前面两种种类的个数;
然后我们确定我们所需要的——即百钱买百鸡
- if(5*cocks+3*hens+chicks/3.0==100)
- printf("cocks=%%d,hens=%%d,chicks=%%d
",cocks,hens,chicks);
运行结果如下:
对于结果较多的穷举法,我们以可以在其中计入计数器:
- #include <stdio.h>
- int main()
- {
- int one,two,five;
- int x;
- printf("请输入x元");
- scanf("%%d",&x);
- int cnt=0;
- for(one=0;one<=100;one++){
- for(two=0;two<=50;two++){
- for(five=0;five<=20;five++){
- if(one*1+two*2+five*5==100*x){
- printf("%%d个一分%%d个两分和%%d个五分组成%%d元
",one,two,five,x);
- cnt+=1;
- }
- }
- }
- }
- printf("%%d",cnt);
- return 0;
-
- }
二:辗转相除法求最大公约数
(辗转相除法求最大公约数大家可以借鉴数学,不在c语言范畴内了^-^)
方法如下:
-
- #include <stdio.h>
- int main()
- {
- int a,b;
- scanf("%%d%%d",&a,&b);
- int c=0;
- while(b!=0){
- c=a%%b;
- a=b;
- b=c;
- }
- printf("%%d",a);
- }
-
-
当然也可以使用枚举法,更好理解但是复杂,不推荐使用
(从我看的网课截下来的)
推荐阅读