c语言求两个非负整数u和v的最大公约数,《C语言》循环型程序设计.doc

《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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值