第五讲循环结构(C++版)_第1页
第五讲循环结构(C++版)_第2页
第五讲循环结构(C++版)_第3页
第五讲循环结构(C++版)_第4页
第五讲循环结构(C++版)_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第三章 循环结构第一节 for语句第二节 while语句第三节 do-while语句第四节 循环嵌套for 语句for(表达式1、表达式2、表达式3) 语句或语句组 for (i=0、i10、i+) cout“welcome ”endl; 求解表达式1表达式2语句求解表达式3For语句的下一语句假真第一节 for语句一、语句格式一、语句格式格式格式1 1说明:语句说明:语句1 1是是forfor循环语句的循环体,它将在满足条件的情况下被重复执行。循环语句的循环体,它将在满足条件的情况下被重复执行。格式格式2 2说明:循环体部分由多个语句构成,应由一对花括号括起来,构成一个语句块的说明:循环体部

2、分由多个语句构成,应由一对花括号括起来,构成一个语句块的形式程序风格提示:写形式程序风格提示:写for循环语句时,循环体的语句相对于循环语句时,循环体的语句相对于for缩进两格。缩进两格。第一节 for语句 二、语句执行过程 for语句的执行过程可由以下4步来描述。 (1)执行“控制变量初始化语句”,使控制变量获得一个初值。 (2)判断控制变量是否满足“条件表达式”,若满足条件则执行一遍循环体,否则结束整个for语句,继续执行for循环下面的句子。 (3)根据增量表达式,计算出控制变量所得到的新值 (4)自动转到第(2)步。第一节 for语句三、语句格式举例三、语句格式举例 (1) (1)将控

3、制变量从将控制变量从1 1变到变到100100,增量为,增量为1 1 for(i=1;i=100;+i) for(i=1;i=1;-i) for(i=100;i=1;-i) (3) (3)控制变量从控制变量从7 7变到变到7777,增量为,增量为7 7 for(i=7;i=77;i+=7) for(i=7;i=2 for(int i=20;i=2;i-=2)i-=2) (5) (5)按所示数列改变控制变量值:按所示数列改变控制变量值:9999、8888、7777、6666、5555、4444、3333、2222、1111、0 0,增,增量为量为-11-11 for(int j=99;j=0;j

4、-=11) for(int j=99;j=0;j-=11) (6) (6)控制变量控制变量i i和和j j共同进行循环控制,共同进行循环控制,i i从从1 1变到变到9999,j j从从2 2变到变到100100,增量均为,增量均为2 2。 for for(int i=1,j=2;i=99&j=100int i=1,j=2;i=99&j=100;i+=2,j+=2i+=2,j+=2)需要说明的是:可以在需要说明的是:可以在forfor循环循环“ 控制变量初始化语句控制变量初始化语句”中声明变量(如上面最后中声明变量(如上面最后3 3个例个例子),这些变量只在子),这些变量只在f

5、orfor循环结构中有效,离开了该循环结构中有效,离开了该forfor结构,变量就无效了。结构,变量就无效了。 第一节 for语句例例4.1 4.1 输出输出1 1100100之间所有偶数。之间所有偶数。#include #include using namespace std;using namespace std;int main ()int main () for (int i=2; i=100 ; i+=2) for (int i=2; i=100 ; i+=2) cout i ; cout i ;return 0;return 0; 例例4.24.2 利用利用forfor循环循环,

6、,计算输出计算输出1+2+1+2+100+100的和的和#include using namespace std;#include using namespace std;int main ()int main () int sum=0; int sum=0; for (int i=1; i=100 ; +i) for (int i=1; i=100 ; +i) sum+=i; sum+=i; cout sum;cout sum; return 0; return 0; 循环语句循环控制语句包括:循环语句:for当型循环语句:while直到型循环语句:do-while循环语句for 循环语句f

7、or(另一种当型循环)for(初始条件表达式;循环控制表达式;循环操作表达式)语句/语句组 一次for循环执行过程 首先执行初始条件表达式(第一次):可以为空 循环控制表达式:一定是一个数值表达式,也可以为空 如果表达式值为真,条件成立,执行循环体一次 如果表达式值为假,条件不成立,退出循环 如果省略,默认值为真,直到遇到break, return语句退出循环 循环操作表达式:也可为空初始条件初始条件表达式表达式语句语语句语句组句组循环操作循环操作表达式表达式循环控循环控制表达制表达式式循环语句for循环语句for 例,计算从0到100的整数中有多少个数是偶数(包括),奇数中有多少数是的倍数#

8、include using namespace std;int main() int i, n2=0, n3=0; for(i=0; i=100; i+) if (i%2=0) n2+; else if (i%3=0) n3+; coutn2“ ”n3endl; return 0;第一节 for语句例例4.3 4.3 利用利用forfor循环计算循环计算n n!的值。!的值。分析:分析:n n!1 1* *2 2* *3 3* *n n#include #include using namespace std;using namespace std;int main ()int main ()

9、 long long s; /Noip2010 long long s; /Noip2010开始开始C+C+语言中语言中long longlong long类型允许使用类型允许使用 int n; /n int n; /n不能定义为不能定义为long longlong long,否则,否则forfor语句死循环语句死循环 s=1; s=1; cinncinn; ; for (int i=1; i=n ; +i) / for (int i=1; i=n ; +i) /若若s s定义为定义为intint,当,当n=13n=13时时s s的值就溢出了的值就溢出了 s s* *=i;=i; coutsc

10、out=13n=13时,时,s s值超过了值超过了intint类型的表示范围。还有一种比类型的表示范围。还有一种比intint更大的类型,称为更大的类型,称为long longlong long,它的表,它的表示范围是示范围是-2-263632 26363-1-1,比,比-10-10191910101919略窄,而我们一直使用的略窄,而我们一直使用的intint范围是范围是-2-231312 23131-1,-1,只比只比-2-2* *10109 92 2* *10109 9略宽。略宽。 输入输出输入输出long longlong long也可以借助于也可以借助于printfprintf和和s

11、canfscanf语句,但对应的占位符却是和平台与编译器相语句,但对应的占位符却是和平台与编译器相关的:在关的:在linuxlinux中,中,gccgcc很统一的用很统一的用%lld%lld;在;在windowswindows中,中,MinGWMinGW的的gccgcc和和VC6VC6都需要用都需要用%I64d%I64d;但;但VS2008VS2008却是用却是用%lld%lld。第一节 for语句例例4.44.4 利用利用forfor循环循环, ,分别计算分别计算1 1100100中奇数的和、偶数的和。中奇数的和、偶数的和。#include #include using namespace

12、std;using namespace std;int main ( )int main ( ) int jssum=0; int jssum=0; int ossum=0; int ossum=0; for (int js=1,os=2;js=99&os=100;js+=2 ,os+=2 ) for (int js=1,os=2;js=99&os=100;js+=2 ,os+=2 ) jssum+=js; jssum+=js; ossum+=os; ossum+=os; cout the sum of odd numbers 1 to 100 is : jssumendl;

13、cout the sum of odd numbers 1 to 100 is : jssumendl; cout the sum of even numbers 1 to 100 is : ossumendl; cout the sum of even numbers 1 to 100 is : ossumendl; return 0; return 0; 说明:说明: 我们也可以在我们也可以在forfor循环初始化或增值表达式部分中放一条以上的语句,中间用逗号隔开。循环初始化或增值表达式部分中放一条以上的语句,中间用逗号隔开。【上机练习4.1】 1、求12+22+32+1002 2、求s=

14、1+1/2+1/3+1/100 3、计算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 1 说明:循环体部分由多个语句构成,应由一对花括号括起来,构成一个语句块的形式。说明:循环体部分由多个语句构成,应由一对花括号括起来,构成一个语句块的形式。程序风格提示:写程序风格提示:写whilewhile循环语句时

15、,循环体的语句相对于循环语句时,循环体的语句相对于whilewhile缩进两格。缩进两格。说明:语句说明:语句1是是while循环语句的循环体,它将在满足条件的情况下被重复执行。循环语句的循环体,它将在满足条件的情况下被重复执行。格式格式2循环语句while 循环语句while(当型循环)while(表达式)语句/语句组 表达式必须是数值表达式 一次循环 计算表达式的值 如果表达式值为真,执行循环体,为假退出循环表达式表达式语句语句/语语句组句组第二节 while语句二、语句执行过程二、语句执行过程(1)(1)计算作为循环控制条件表达式的值,得到逻辑真或假,假定用计算作为循环控制条件表达式的值

16、,得到逻辑真或假,假定用M M表示。表示。(2)(2)若若M M为真,则执行了一遍循环体,否则离开循环,结束整个为真,则执行了一遍循环体,否则离开循环,结束整个whilewhile语句的执行。语句的执行。(3)(3)循环体的所有语句执行结束后,自动转向第循环体的所有语句执行结束后,自动转向第(1)(1)步执行。步执行。三、格式举例三、格式举例(1) i=0;(1) i=0; while (i10) while (ix;(2) cinx; while while(x0 xx; cinx;功能:当输入的数据小于功能:当输入的数据小于0 0时,重复读数据。时,重复读数据。循环语句while计算从1到

17、100的所有整数的平方和#include using namespace std;int main() int i=100; int sum=0; while(i0) sum = sum+i*i; i-; printf(“sum=%dn”, sum); return 0;循环语句while第二节 while语句例例4.5 4.5 求求s=1 +2 +3s=1 +2 +3+n+n,当加到第几项时,当加到第几项时,s s的值会超过的值会超过10001000?程序如下:程序如下: #include #include using namespace std;using namespace std;in

18、t main ()int main () int n=0,s=0; int n=0,s=0; while (s=1000) while (s=1000) +n; +n; s+=n; s+=n; coutn; coutn; return 0; return 0; 第二节 while语句例例4.6 4.6 求两个正整数,的最大公约数。求两个正整数,的最大公约数。分析:求两个整数的最大公约数可以采用辗转相除法。以下是辗转相除法的算法:分别用分析:求两个整数的最大公约数可以采用辗转相除法。以下是辗转相除法的算法:分别用m m,n n,r r表示被除数、除数、余数;表示被除数、除数、余数;1)1)求求m

19、 m除以除以n n的余数的余数r r;2)2)当当r!=0,r!=0,执行第执行第3)3)步;若步;若r=0r=0,则,则n n为最大公约数为最大公约数, ,算法结束。算法结束。3)3)将将n n的值赋给的值赋给m m,将,将r r的值赋给的值赋给n n;再求;再求m m除以除以n n的余数的余数r r。4)4)转到第转到第2)2)步步#include #include using namespace std;using namespace std;int main ()int main () int m,n,r; int m,n,r; cinmn; cinmn; r =m % n; r =m

20、 % n; while (r!=0) / while (r!=0) /也可以使用也可以使用 while (r),c+ while (r),c+中中 非非0 0即真即真 m=n; m=n; n=r; n=r; r=m % n; r=m % n; cout cout最大公约数最大公约数=nendl;=n=5+1/n =5的最小的最小n n值。值。分析:此题不等式的左边是一个求和的算式,该和式中的数据项个数是未知的,也正是要分析:此题不等式的左边是一个求和的算式,该和式中的数据项个数是未知的,也正是要求出的。对于和式中的每个数据项,对应的通式为求出的。对于和式中的每个数据项,对应的通式为1/i1/i

21、,i=1i=1,2 2,n n。所以可采用循环累加的方法来计算出它的值。设循环变量为所以可采用循环累加的方法来计算出它的值。设循环变量为i i,它应从,它应从1 1开始取值,每次增开始取值,每次增加加1 1,直到和式的值不小于,直到和式的值不小于5 5为止,此时的为止,此时的i i值就是所求的值就是所求的n n。设累加变量为。设累加变量为s s,在循环体内,在循环体内把把1/i1/i的值累加到的值累加到s s上。上。根据以上分析,采用根据以上分析,采用whilewhile循环编写出程序如下:循环编写出程序如下:#include #include using namespace std;usin

22、g namespace std;int main ()int main () int i=0; int i=0; float s=0; float s=0; while(s5) / while(s5) /当当s s的值还未超过的值还未超过5 5时时 +i; +i; s+=1.0/i; s+=1.0/i; couti; couti; return 0; return 0; 若采用若采用forfor循环来写,则如下所示:循环来写,则如下所示:#include #include using namespace std;using namespace std;int main ()int main (

23、) int i; int i; float s=0; float s=0; for(i=1;s5;+i) for(i=1;s5;+i) s+=1.0/i; s+=1.0/i; couti-1; couti-1; return 0; return 0; 第二节 while语句例例4.84.8 数据统计数据统计 输入一些整数,求出它们的最小值、最大值和平均值(保留输入一些整数,求出它们的最小值、最大值和平均值(保留3 3位小数)。输入保证这位小数)。输入保证这些数都是不超过些数都是不超过10001000的整数。的整数。 样例输入:样例输入:2 8 3 5 1 7 3 62 8 3 5 1 7 3

24、6 样例输出:样例输出:1 8 4.3751 8 4.375【参考程序】【参考程序】#include#includeint main()int main() int x,n=0,min,max,s=0; int x,n=0,min,max,s=0; while (scanf(“%d”,&x)= =1) while (scanf(“%d”,&x)= =1) /当有输入的时候,表达式为真,即当有输入的时候,表达式为真,即= =1= =1,执行循环,执行循环 s+=x; s+=x; if (xmin) min=x; if (xmax) max=x; if (xmax) max=x;

25、+n; +n; printf(%d %d %.3lfn,min,max,(double)s/n); printf(%d %d %.3lfn,min,max,(double)s/n); return 0; return 0; 第二节 while语句 最后,我们来更仔细地研究一下输最后,我们来更仔细地研究一下输入输出。研究对象就是经典的入输出。研究对象就是经典的“A+B”“A+B”问问题:输入若干对整数,输出每对之和。假题:输入若干对整数,输出每对之和。假设每个整数不超过设每个整数不超过10109 9,一共不超过,一共不超过10106 6个个数对。数对。 第第1 1种方法是:种方法是: #incl

26、ude #include int main() int main() int a,b; int a,b; while(scanf(%d%d,&a,&b)=2) while(scanf(%d%d,&a,&b)=2) printf(%dn,a+b); printf(%dn,a+b); return 0; return 0; 第第2 2种方法也许更加常用(你再也不种方法也许更加常用(你再也不用记住用记住%d%d、%lf%lf等恼人的占位符了):等恼人的占位符了): #include #include using namespace std; using namespa

27、ce std; int main() int main() int a,b; int a,b; while(cin a b ) while(cin a b ) cout a+b endl; cout a+b endl; return 0; return 0; 课堂练习 以下的 for 循环( )。 for(x=0,y=0;(y!=123)&(x0); a的值是( )。A. 5B. 0C. 1D. -2BC【上机练习4.2】 1、用while循环完成如下3题: 求s=1+2+3+4+10 求s=1+1/2+1/3+1/100 计算n!,其中n由键盘输入。 2、输入任意的自然数A, B,

28、求A , B的最小公倍数。 3、小球从100高处自由落下,着地后又弹回高度的一半再落下。求第20次着地时, 小球共通过多少路程? 4、Faibonacci数列前几项为: 0,1,1,2,3,5,8,其规律是从第三项起, 每项均等于前两项之和。求前30项,并以每行5个数的格式输出。第三节 do-while语句一、语句格式一、语句格式格式格式1说明:语句说明:语句1 1是是do-whiledo-while的循环体。的循环体。格式格式2说明:循环体部分由多个语句构成,应由一对花括号括起来,构成一个语句块的形式。说明:循环体部分由多个语句构成,应由一对花括号括起来,构成一个语句块的形式。二、语句执行过

29、程二、语句执行过程(1)(1)执行一遍循环体。执行一遍循环体。(2)(2)求出作为循环条件的求出作为循环条件的“条件表达式条件表达式”的值,若为逻辑值真则自动转向第的值,若为逻辑值真则自动转向第(1)(1)步,否则结束步,否则结束dodo循环的执循环的执行过程,继续执行其后面的语句。行过程,继续执行其后面的语句。在在dodo语句的循环体中也可以使用语句的循环体中也可以使用breakbreak语句,用它来非正常结束循环的执行。语句,用它来非正常结束循环的执行。循环语句do-while 循环语句do-while(直到型循环)do 语句/语句组while(表达式); 一次循环 执行一次循环体 计算表

30、达式,条件成立再执行一次循环体,否则退出循环语句语句/语句语句组组表达式表达式循环语句do-while循环语句do-while计算从1到100的所有整数的平方和#include using namespace std;int main() int i=100; int sum=0; do sum = sum+i*i; i-; while (i0); coutsumendl; return 0;第三节 do-while语句三、实例三、实例例例4.9 4.9 对于求两个正整数,的最大公约数可以用对于求两个正整数,的最大公约数可以用dodowhilewhile实现。实现。代码如下,请完善:代码如下,

31、请完善: #include #include using namespace std;using namespace std;int main ()int main () int m int m,n n,r;r; cinmn; cinmn; do / do /辗转相除法辗转相除法 r =m % n; r =m % n; m=_; m=_; n=_; n=_; while ( _ ); while ( _ ); coutthe greatest common divisor is:_; coutthe greatest common divisor is:_; return 0; return

32、0; 第三节 do-while语句例例4.104.10 求求19921992个个19921992的乘积的末两位数是多少?的乘积的末两位数是多少?【分析】积的个位与十位数只与被乘数与乘数的个位与十位数字有关,所以本题相当于求【分析】积的个位与十位数只与被乘数与乘数的个位与十位数字有关,所以本题相当于求19921992个个9292相乘,而且本次的乘积是下一次相乘的被乘数,因此也只需取末两位参与运算就相乘,而且本次的乘积是下一次相乘的被乘数,因此也只需取末两位参与运算就可以了。可以了。 #include#includeusing namespace std;using namespace std;i

33、nt main()int main() int a=1,t=0; int a=1,t=0; do do +t; +t; a=(a a=(a* *92)%100;92)%100; while (t!=1992); while (t!=1992); coutaendl; coutaendl; return 0; return 0; 第三节 do-while语句例例4.11 4.11 校体操队到操场集合校体操队到操场集合, ,排成每行排成每行2 2人人, ,最后多出最后多出1 1人人; ;排成每行排成每行3 3人人, ,也多出也多出1 1人人; ;分别按每行排分别按每行排4,5,64,5,6人人,

34、,都多出都多出1 1人人; ;当排成每行当排成每行7 7人时人时, ,正好不多。求校体操队至少多少人正好不多。求校体操队至少多少人? ?【分析】设校体操队为【分析】设校体操队为x x人人, ,根据题意根据题意x x应是应是7 7的倍数的倍数, ,因此因此x x的初值为的初值为7,7,以后用以后用x+=7)x+=7)改变改变x x值;值; 为了控制循环为了控制循环, , 用逻辑变量用逻辑变量yesyes为真为真(true) (true) 使循环结束;使循环结束; 如果诸条件中有一个不满足如果诸条件中有一个不满足, yes , yes 的值就会为假的值就会为假(false)(false),就继续循

35、环。,就继续循环。 #include#includeusing namespace std;using namespace std;int main()int main() bool yes; bool yes; int x=0; int x=0; do do yes=true; yes=true; x+=7; x+=7; if (x%2!=1) yes=false; if (x%2!=1) yes=false; if (x%3!=1) yes=false; if (x%3!=1) yes=false; if (x%4!=1) yes=false; if (x%4!=1) yes=false;

36、 if (x%5!=1) yes=false; if (x%5!=1) yes=false; if (x%6!=1) yes=false; if (x%6!=1) yes=false; while (yes=false); / while (yes=false); /直到直到yesyes的值为真的值为真 coutAll=x; coutAll=x; return 0; return 0; 程序中对每个程序中对每个x x值,都先给值,都先给yes yes 赋真值,只有在循环体各句对赋真值,只有在循环体各句对x x进行判断时,都得到进行判断时,都得到“通过通过”(此处不(此处不赋假值)才能保持真值。

37、赋假值)才能保持真值。【上机练习4.3】1 1、用、用do-whiledo-while循环完成如下循环完成如下3 3题:题:求求s=1+2+3+4+s=1+2+3+4+10+10求求s=1+1/2+1/3+s=1+1/2+1/3+1/100+1/100计算计算n n!,其中!,其中n n由键盘输入。由键盘输入。2 2、读一组实数、读一组实数, ,遇零终止遇零终止, ,打印其中正、负数的个数及各自的总和。打印其中正、负数的个数及各自的总和。3 3、用辗转相除法求两个自然数的最大公约数。、用辗转相除法求两个自然数的最大公约数。4 4、找出被、找出被2 2、3 3、5 5除时余数为除时余数为1 1的

38、最小的十个数。的最小的十个数。5 5、将一根长为、将一根长为369cm369cm的钢管截成长为的钢管截成长为69cm69cm和和39cm39cm两种规格的短料。在这两种规两种规格的短料。在这两种规格的短料至少各截一根的前提下格的短料至少各截一根的前提下, , 如何截才能余料最少?如何截才能余料最少?第四节 循环嵌套 例例4.12 4.12 求求 S=1!+2!+3!+.+10! S=1!+2!+3!+.+10! 分析:这个问题是求分析:这个问题是求1010以内自然数的阶乘之和,可以用以内自然数的阶乘之和,可以用forfor循环来实现。程循环来实现。程序结构如下:序结构如下: for(i=1;i

39、=10;+i) for(i=1;i=10;+i) (1)i (1)i阶乘的值存到阶乘的值存到t t; /t=i! /t=i! (2) (2)累加累加t t到到s s中;中; /s+=t /s+=t 显然根据以上结构,通过显然根据以上结构,通过1010次的循环可以求出次的循环可以求出1 1!,!,2 2!,!,10!,10!,并不断累并不断累加起来,求出加起来,求出s s。而求。而求t=i!,t=i!,又可以用一个又可以用一个forfor循环来实现:循环来实现: t=1; t=1; for (j=1;j=i;+j) for (j=1;j=i;+j) t t* *=j;=j; 因此整个程序为:因此

40、整个程序为:#include #include using namespace std;using namespace std;int main ()int main () int t,s; int t,s; s=0; s=0; for(int i=1;i=10;+i) for(int i=1;i=10;+i) t=1; t=1; for (int j=1;j=i;+j) / for (int j=1;j=i;+j) /求求i!i! t t* *=j;=j; s+=t; / s+=t; /累加累加i!i! couts; couts; return 0; return 0; 以上程序是一个以上程

41、序是一个forfor循环的嵌套。这种方法是比较容易想到的,但实际上对于求循环的嵌套。这种方法是比较容易想到的,但实际上对于求i i!,我们!,我们可以根据求出的(可以根据求出的(i-1i-1)!乘上)!乘上i i即可得到,而无需重新从即可得到,而无需重新从1 1再累乘到再累乘到i i。第四节 循环嵌套第四节 循环嵌套因此程序可改为因此程序可改为: :#include #include using namespace std;using namespace std;int main ()int main () int t=1,s=0; int t=1,s=0; for(int i=1;i=10;

42、+i) for(int i=1;i=10;+i) t t* *=i; /t=i; /t为上一个数的为上一个数的i-1i-1的阶乘值,再乘的阶乘值,再乘以以i i即为即为i!i! s+=t; / s+=t; /累加累加i!i! couts; couts; return 0; return 0; 显然第二个程序的效率要比第一个高得多。第一个程序要进行显然第二个程序的效率要比第一个高得多。第一个程序要进行1+2+3+10=551+2+3+10=55次循环,而第二程序进行次循环,而第二程序进行1010次循环。若题目中求的是次循环。若题目中求的是1 1!+2+2!+1000+1000!,则两!,则两个程

43、序的效率区别更明显。个程序的效率区别更明显。第四节 循环嵌套例例4.13 4.13 一个炊事员上街采购,用一个炊事员上街采购,用500500元钱买了元钱买了9090只鸡,其中母鸡一只只鸡,其中母鸡一只1515元元, ,公鸡一只公鸡一只1010元,元,小鸡一只小鸡一只5 5元,正好把钱买完。问母鸡,公鸡,小鸡各买了多少只?元,正好把钱买完。问母鸡,公鸡,小鸡各买了多少只?【分析】设母鸡【分析】设母鸡i i只只, ,公鸡公鸡j j只只, ,则小鸡为则小鸡为90-i-j90-i-j只只, ,则则1515* *i+ 10i+ 10* * j+(90-i-j) j+(90-i-j)* *5=500,5=

44、500,显然一显然一个方程求两个未知数是不能直接求解。必须组合出所有可能的个方程求两个未知数是不能直接求解。必须组合出所有可能的i,ji,j值,看是否满足条件。值,看是否满足条件。这里这里i i的值可以是的值可以是0 0到到3333,j j的值可以的值可以0 0到到5050。源程序如下:。源程序如下:#include #include using namespace std;using namespace std;int main ()int main () int k; int k; for (int i=0;i=33;+i) for (int i=0;i=33;+i) / /枚举母鸡的数量

45、枚举母鸡的数量 for (int j=0;j=50;+j) / for (int j=0;j=50;+j) /枚举公鸡的数量枚举公鸡的数量 k=90-i-j; k=90-i-j; if (15 if (15* *i+10i+10* *j+kj+k* *5=500)5=500) cout cout母鸡有母鸡有ii只只,公鸡有公鸡有jj只只,小鸡有小鸡有kk只只 endl; endl; return 0; return 0; 第四节 循环嵌套例例4.14 4.14 利用利用forfor循环语句输出图循环语句输出图4-4-1 1中的三角形。中的三角形。*图图4-1#include #include

46、using namespace std;using namespace std;int main ()int main () for (int i=1; i=5; +i) / for (int i=1; i=5; +i) /控制行数控制行数 for (int j=1; j=i; +j) / for (int j=1; j=i; +j) /输出一行中的输出一行中的* *数数 cout cout* *; coutendl; / coutendl; /换行换行 return 0; return 0; 第四节 循环嵌套例例4.15 4.15 求求100100999999中的水仙花数。若三位数中的水仙花

47、数。若三位数ABCABC,ABC=AABC=A3 3+B+B3 3+C+C3 3,则称,则称ABCABC为水仙花数。为水仙花数。例如例如153153,1 13 3+5+53 3+3+33 3=1+125+27=153=1+125+27=153,则,则153153是水仙花数。是水仙花数。【分析】【分析】 根据题意,采用三重循环来求解。由于循环次数一定,用根据题意,采用三重循环来求解。由于循环次数一定,用forfor循环最为简单。程循环最为简单。程序如下:序如下:#include#include#include /#include /调用调用setw函数需注明使用该库函数需注明使用该库using

48、namespace std;using namespace std;int main()int main() for (int a=1; a=9; +a) for (int a=1; a=9; +a) for (int b=0; b=9; +b) for (int b=0; b=9; +b) for (int c=0; c=9; +c) for (int c=0; c=9; +c) if (a if (a* *a a* *a+ba+b* *b b* *b+cb+c* *c c* *c=ac=a* *100+b100+b* *10+c) 10+c) coutsetw(6)a coutsetw(6

49、)a* *100+b100+b* *10+c;10+c; / /setw函数控制输出场宽函数控制输出场宽 return 0; return 0; 运行结果:运行结果:153153370370371371407407第四节 循环嵌套同时也可以采用一个同时也可以采用一个for循环来求解,表面上看好像优于三重循环,实际上却比循环来求解,表面上看好像优于三重循环,实际上却比上面的程序效率低,请同学们自己分析。上面的程序效率低,请同学们自己分析。程序如下:程序如下:#include#includeusing namespace std;int main() int a,b,c; for (int m=1

50、00; m=999; +m) a=m/100; /m的百位 b=(m%100)/10; /m的十位 c=m%10; /m的个位 if (a*a*a+b*b*b+c*c*c=m) coutsetw(6)m; return 0;第四节 循环嵌套例例4.16 4.16 输出输出100200100200中所有的素数。中所有的素数。分析:我们可对100-200之间的每一个整数进行判断,若它是为素数,则输出。而对于任意整数i,根据素数定义,我们从2开始,到sqrt(i),找i的第一个约数,若找到第一个约数,则i必然不是素数。程序如下:#include #include /在Dev C+中可调用数学函数库c

51、mathusing namespace std;int main () int x; for (int i=100;i=200;+i) x=2; while(xfloor(sqrt(i) coutit; return 0;第四节 循环嵌套例例4.174.17 输出所有形如输出所有形如aabbaabb的四位完全平方数(即前两位数字相等,后两位数字也相等)。的四位完全平方数(即前两位数字相等,后两位数字也相等)。【分析】【分析】分支和循环结合在一起时威力特别强大:我们枚举所有可能的分支和循环结合在一起时威力特别强大:我们枚举所有可能的aabbaabb,然后判断它们是否为完全平方数。,然后判断它们是

52、否为完全平方数。注意,注意,a a的范围是的范围是1 19 9,b b可以是可以是0 0。主程序如下:。主程序如下: for (a=1; a=9; a+) for (a=1; a=9; a+) for (b=0; b=9; b+) for (b=0; b=9; b+) if (aabb if (aabb是完全平方数是完全平方数) printf(%dn,aabb);) printf(%dn,aabb);另一个思路是枚举平方根另一个思路是枚举平方根x x,参考程序如下:,参考程序如下:#include#includeint main()int main() int n=0,hi,lo;int n=

53、0,hi,lo;for (int x=1 ; ; +x) /for (int x=1 ; ; +x) /可以直接从可以直接从x=32x=32开始枚举开始枚举 n=xn=x* *x;x; if (n1000) continue;if (n9999) break;if (n9999) break; hi = n/100;hi = n/100;lo = n%100;lo = n%100;if (hi/10 = hi%10 & lo/10 = lo%10) printf(%dn,n);if (hi/10 = hi%10 & lo/10 = lo%10) printf(%dn,n); r

54、eturn 0;return 0; 第四节 循环嵌套例例4.18 4.18 阶乘之和阶乘之和 输入输入n n,计算,计算S=1! + 2! + 3! + S=1! + 2! + 3! + + n! + n!的末的末6 6位位( (不含前导不含前导0)0)。n=10n=106 6, n! n!表示前表示前n n个正整数之积。个正整数之积。 样例输入:样例输入:1010 样例输出:样例输出:3791337913【分析】【分析】 这个任务并不难,引入累加变量这个任务并不难,引入累加变量S S之后,核心算法只有一句话:之后,核心算法只有一句话:for (i=1;i=n;i+) S+=i!for (i=

55、1;i=n;i+) S+=i!。不过。不过C+C+语言并没有阶乘运算符,所以这句话只是伪代码,而不是真正的代码。事实上,我们还需要一次循语言并没有阶乘运算符,所以这句话只是伪代码,而不是真正的代码。事实上,我们还需要一次循环来计算环来计算i!i!:for (j=1;j=i;+j) factorialfor (j=1;j=i;+j) factorial* *=j;=j;。代码如下:。代码如下:#include#includeint main()int main() int n,s=0;int n,s=0;scanf(%d,&n);scanf(%d,&n);for (int i=1

56、;i=n;+i)for (int i=1;i=n;+i) int factorial=1;int factorial=1;for (int j=1;j=i;+j)for (int j=1;j=i;+j) factorial factorial* *=j;=j;s+=factorial;s+=factorial; printf(%dn,s%1000000);printf(%dn,s%1000000);return 0;return 0; 注意累乘器注意累乘器factorial(factorial(英文英文“阶乘阶乘”的意思的意思) )定义在循环里面。换句话说,每执行一次循环体,都定义在循环里面。

57、换句话说,每执行一次循环体,都要重新声明一次要重新声明一次factorialfactorial,并初始化为,并初始化为1(1(想一想,为什么不是想一想,为什么不是0)0)。因为只要末。因为只要末6 6位,所以输出时对位,所以输出时对10106 6取模。取模。第四节 循环嵌套 当当n=100n=100时,输出时,输出-961703-961703,直觉告诉我们:乘法溢出了。这个直觉很容易通过,直觉告诉我们:乘法溢出了。这个直觉很容易通过“输出中间变量输出中间变量”法得到验证,但若要解决这个问题,还需要一点数学知识。试一下法得到验证,但若要解决这个问题,还需要一点数学知识。试一下n=10n=106

58、6时输出什么?更会溢出,但是时输出什么?更会溢出,但是重点不在这里。事实上,它的速度太慢!让我们把程序改成重点不在这里。事实上,它的速度太慢!让我们把程序改成“每步取模每步取模”的形式,然后加一个的形式,然后加一个“计时计时器器”,看看它到底有多慢,看看它到底有多慢。#include#include#include#includeint main()int main() const int MOD=1000000;const int MOD=1000000;int n,s=0;int n,s=0;scanf(%d,&n);scanf(%d,&n);for (int i=1;i=n;+i)for (int i=1;i=n;+i) int factorial=1;int factorial=1;for (int j=1;j=i;+j)for (int j=1;j=i;+j)factorial=(factorialfactorial=(factorial* *j%MOD);j%MOD);s=(s+factorial)%MOD;s=(s+factorial)%MOD; printf(%dn,s);pri

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论