《C语言》循环型程序设计
循环型程序设计
(一)穷举
穷举是一种重复型算法。它的基本思想是,对问题的所有可能状态一一测试,直到找到解或将全部可能状态都测试过为止。
循环控制有两种办法:计数法与标志法。计数法要先确定循环次数,然后逐次测试,完成测试次数后,循环结束。标志法是达到某一目标后,使循环结束。
例1.百钱买百鸡。
公元前五世纪,我国古代数学家张丘建在《算经》一书中提出了“百鸡问题”。鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、母、雏各几何?
main()
{ int cocks,hens,chicks;
cocks=0;
while(cocks<=19)
{
hens=0;
while(hens<=33)
{
chicks=100-cocks-hens;
if (5.0*cocks+3.0*hens+chicks/3.0==100.0)
printf(“%d %d %d\n”,cocks,hens,chicks);
hens=hens+1;
}
cocks=cocks+1;
}
}
例2.搬砖问题。
36块砖,36人搬;男搬4,女搬3,两个小孩抬一砖。要求一次全搬完,问男、女、小孩各若干?
例3.百马百担问题: 有100匹马,驮100担货,大马驮3担,中马驮2担,两匹小马驮1担,问有大、中、小马各多少?
例4.打印出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。例如,153是一水仙花数,因为153=13+53+33。
例5.爱因斯坦的阶梯问题。
设有一阶梯,每步跨2阶,最后余1阶;每步跨3阶,最后余2阶;每步跨5阶,最后余4阶;每步跨6阶,最后余5阶;每步跨3阶时,正好到阶梯顶。问共有多少阶梯。
main()
{ int ladders=7,flag=1;
while (flag)
{ if (ladders%3= =2 && ladders%5= =4 && ladders%6= =5)
flag=0;
else
ladders=ladders+14;
}
printf(“该阶梯共有%d阶\n”,ladders);
}
循环型程序设计
(二)迭代(递推)
迭代是一个不断有新值取代变量的旧值,或由旧值递推出变量的新值的过程。
例1.人口增长问题。
按年2%的增长速度,现有12亿人,10年后将有多少人?
分析:设现人口数为m,则第一年后人口变为:m*(1+2%) ; 第二年后,把上述赋值表达式再执行一次。要计算10年后的人口,度不是把上述表达式执行10次。
·初值; m=12
·迭代公式; m=m*(1+0.02)
·迭代次数; 10次
程序设计如下:
main()
{ float m=12;
int i;
for (i=1;i<=10;i++)
m=m*(1+0.02);
printf(“10年后人口为:%f亿\n”,m);
}
例2.一球从100m高度自由落下,每次落地后反跳回原高度的一半,再落下。求它在第10次落地时,共经过多少m?第10次反弹多高?
例3.1991年我国人口为11.3亿人,如果人口增长率为每年1.35%时,到哪年我国的人口超过13亿?
main()
{ float m=11.3;
int n=1991;
while (m<=13)
{ m=m*(1+0.0135);
n=n+1; }
printf(“到%d年我国的人口超过13亿);
}
例4.有一张厚0.5毫米,面积任意大的纸,将它不断对折。问对折多少次后,其厚度可达2000米。(注意:2000米=2000000毫米,所以厚度变量应定义成long型)。
例5.求Fibonacci数列前40个数。这个数列有如下特点:第1、2两个数为1、1。从第3个数开始,该数是其前面两个数之和。即数列为:1,1,2,3,5,8,13,21,34,……
(这是意大利数学家Fibonacci曾提出的一个有趣的问题:
设有一对新生兔子,从第三个月开始它们每个月都生一对兔子。按此规律,并假设没有兔子死亡,一年后共有多少对兔子。)
分析:f1=f2=1; <1>
fn=fn-1+fn-2; (n>=3) <2>
式<1>为赋初值,式<2>即为迭代公式。用C语言来描述式<2>为:
f=f1+f2;
f1=f2; /*为下一次迭代作准备*/
f2=f;
程序设计如下:
main()
{long f1=1,f2=1,f;
int i;
printf(“%ld,%ld”,f1