信息学社团暑假第三次复习讲义循环结构复习书本for循环、while循环、do-while循环、循环嵌套for循环练习1:输出1—100之间所有偶数练习2:利用for循环计算n!的值。说明:n!叫做n的阶乘n!=1*2*3*……*n,如:3!=1*2*3注意:变量类型,因为当n=13时,s值超过了int类型的表示范围。还有一种比int更大的类型,称为longlong,它的表示范围是-263~263-1,比-1019~1019略窄,而我们一直使用的int范围是-231~231-1,只比-2*109~2*109略宽。练习3、利用for循环,分别计算1—100中奇数的和、偶数的和上机练习题:1、求12+22+32+…+10022、求s=1+1/2+1/3+…+1/1003、计算100之内所有的奇数之和。4、求10个数中的最大值和最小值。5、按字母表的顺序,从字母A到Z顺序打印输出。6、求菲波拉契数列a0,a1,a2,……a20。a0=0,a1=1,a2=a1+a0,a3=a2+a1,……,an=an-1+an-2;如0,1,1,2,3,5,8,13,21,……while语句练习1:求s=1+2+3……+n,当加到第几项时,s的值会超过1000?练习2:求两个正整数m,n的最大公约数。分析:求两个整数的最大公约数可以采用辗转相除法。以下是辗转相除法的算法:分别用m,n,r表示被除数、除数、余数;1)求m除以n的余数r;2)当r!=0,执行第3)步;若r==0,则n为最大公约数,算法结束。3)将n的值赋给m,将r的值赋给n;再求m除以n的余数r。4)转到第2)步练习3、编一程序求满足不等式1+1/2+1/3…+1/n=5的最小n值。分析:此题不等式的左边是一个求和的算式,该和式中的数据项个数是未知的,也正是要求出的。对于和式中的每个数据项,对应的通式为1/i,i=1,2,…n。所以可采用循环累加的方法来计算出它的值。设循环变量为i,它应从1开始取值,每次增加1,直到和式的值不小于5为止,此时的i值就是所求的n。设累加变量为s,在循环体内把1/i的值累加到s上。练习4、数据统计输入一些整数,求出它们的最小值、最大值和平均值(保留3位小数)。输入保证这些数都是不超过1000的整数。样例输入:28351736样例输出:184.375上机练习题:1、用while循环完成如下3题:①求s=1+2+3+4+…+10②求s=1+1/2+1/3+…+1/100③计算n!,其中n由键盘输入。2、输入任意的自然数A,B,求A,B的最小公倍数。3、小球从100高处自由落下,着地后又弹回高度的一半再落下。求第20次着地时,小球共通过多少路程?4、Faibonacci数列前几项为:0,1,1,2,3,5,8,…,其规律是从第三项起,每项均等于前两项之和。求前30项,并以每行5个数的格式输出。do-while语句练习1、对于求两个正整数m,n的最大公约数可以用do—while实现。代码如下,请完善:#includeiostreamusingnamespacestd;intmain(){intm,n,r;cinmn;do//辗转相除法{r=m%n;m=____;n=_____;}while(_______);coutthegreatestcommondivisoris:______;return0;}练习2、求1992个1992的乘积的末两位数是多少?【分析】积的个位与十位数只与被乘数与乘数的个位与十位数字有关,所以本题相当于求1992个92相乘,而且本次的乘积是下一次相乘的被乘数,因此也只需取末两位参与运算就可以了。练习3、校体操队到操场集合,排成每行2人,最后多出1人;排成每行3人,也多出1人;分别按每行排4,5,6人,都多出1人;当排成每行7人时,正好不多。求校体操队至少多少人?【分析】①设校体操队为x人,根据题意x应是7的倍数,因此x的初值为7,以后用x+=7)改变x值;②为了控制循环,用逻辑变量yes为真(true)使循环结束;③如果诸条件中有一个不满足,yes的值就会为假(false),就继续循环。上机练习题:用do-while循环完成如下3题:①求s=1+2+3+4+…+10②求s=1+1/2+1/3+…+1/100③计算n!,其中n由键盘输入。2、读一组实数,遇零终止,打印其中正、负数的个数及各自的总和。3、用辗转相除法求两个自然数的最大公约数。4、找出被2、3、5除时余数为1的最小的十个数。5、将一根长为369cm的钢管截成长为69cm和39cm两种规格的短料。在这两种规格的短料至少各截一根的前提下,如何截才能余料最少?循环嵌套练习1:求S=1!+2!+3!+....+10!分析:这个问题是求10以内自然数的阶乘之和,可以用for循环来实现。程序结构如下:for(i=1;i=10;++i){(1)i阶乘的值存到t;//t=i!(2)累加t到s中;//s+=t}显然根据以上结构,通过10次的循环可以求出1!,2!,…10!,并不断累加起来,求出s。而求t=i!,又可以用一个for循环来实现:t=1;for(j=1;j=i;++j)t*=j;}练习2、一个炊事员上街采购,用500元钱买了90只鸡,其中母鸡一只15元,公鸡一只10元,小鸡一只5元,正好把钱买完。问母鸡,公鸡,小鸡各买了多少只?【分析】设母鸡i只,公鸡j只,则小鸡为90-i-j只,则15*i+10*j+(90-i-j)*5=500,显然一个方程求两个未知数是不能直接求解。必须组合出所有可能的i,j值,看是否满足条件。这里i的值可以是0到33,j的值可以0到50。练习3、利用for循环语句输出图4-1中的三角形。***************练习3、求100-999中的水仙花数。若三位数ABC,ABC=A3+B3+C3,则称ABC为水仙花数。例如153,13+53+33=1+125+27=153,则153是水仙花数。【分析】根据题意,采用三重循环来求解。由于循环次数一定,用for循环最为简单。练习4、输出100—200中所有的素数。分析:我们可对100-200之间的每一个整数进行判断,若它是为素数,则输出。而对于任意整数i,根据素数定义,我们从2开始,到sqrt(i),找i的第一个约数,若找到第一个约数,则i必然不是素数。练习5、输出所有形如aabb的四位完全平方数(即前两位数字相等,后两位数字也相等)。【分析】分支和循环结合在一起时威力特别强大:我们枚举所有可能的aabb,然后判断它们是否为完全平方数。注意,a的范围是1~9,b可以是0。练习6、阶乘之和输入n,计算S=1!+2!+3!+…+n!的末6位(不含前导0)。n=106,n!表示前n个正整数之积。样例输入:10样例输出:37913【分析】这个任务并不难,引入累加变量S之后,核心算法只有一句话:for(i=1;i=n;i++)S+=i!。不过C++语言并没有阶乘运算符,所以这句话只是伪代码,而不是真正的代码。事实上,我们还需要一次循环来计算i!:for(j=1;j=i;++j)factorial*=j;。上级练习题:1、求s=11+22+33+..+NN2、求s=1+1/2!+1/3!+…+1/10!3、输入一个整数,若是素数,输出“YES”,否则输出“NO”4、任给一个自然数n,求出这个自然数不同因数的个数。如:n=6时,因为1,2,3,6这四个数均是6的因数,故输出为total=4。5、输入一列图形(字母金字塔)aababc..abc……yz6、把一张一元钞票换成一分,二分和五分的硬币,每种至少一枚。问有哪几种换法?7、百鸡问题:一只公鸡值5元,一只母鸡值3元,而1元可买3只小鸡。现有100元钱,想买100只鸡。问可买公鸡、母鸡、小鸡各几只?8、某人想将手中的一张面值100元的人民币换成10元、5元、2元和1元面值的票子。要求换正好40张,且每种票子至少一张。问:有几种换法?应适当考虑减少重复次数。9、有一堆100多个的零件,若三个三个数,剩二个;若五个五个数,剩三个;若七个七个数,剩五个。请你编一个程序计算出这堆零件至少是多少个?10、编写一程序,验证角谷猜想。所谓的角谷猜想是:“对于任意大于1的自然数n,若n为奇数,则将n变为3*n+1,否则将n变为n的一半。经过若干次这样的变换,一定会使n变为1。”11、哥德巴赫猜想(任何充分大的偶数都可由两个素数之和表示)。将4-100中的所有偶数分别用两个素数之和表示。输出为:4=2+26=3+3…100=3+97