c循环结构解析实用实用教案

上传人:hs****ma 文档编号:569478480 上传时间:2024-07-29 格式:PPT 页数:31 大小:631KB
返回 下载 相关 举报
c循环结构解析实用实用教案_第1页
第1页 / 共31页
c循环结构解析实用实用教案_第2页
第2页 / 共31页
c循环结构解析实用实用教案_第3页
第3页 / 共31页
c循环结构解析实用实用教案_第4页
第4页 / 共31页
c循环结构解析实用实用教案_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《c循环结构解析实用实用教案》由会员分享,可在线阅读,更多相关《c循环结构解析实用实用教案(31页珍藏版)》请在金锄头文库上搜索。

1、第一节for语句(yj)一、语句一、语句(yj)(yj)格式格式格式格式1 1说明:语句说明:语句1 1是是forfor循环语句的循环体,它将在满足条件的情况下被重复执行循环语句的循环体,它将在满足条件的情况下被重复执行(zhxng)(zhxng)。格式格式2 2说明:循环体部分由多个语句构成,应由一对花括号括起来,构成一个语句块的形说明:循环体部分由多个语句构成,应由一对花括号括起来,构成一个语句块的形式程序风格提示:写式程序风格提示:写for循环语句时,循环体的语句相对于循环语句时,循环体的语句相对于for缩进两格。缩进两格。第1页/共30页第一页,共31页。第一节for语句(yj)二、语

2、句(yj)执行过程for语句(yj)的执行过程可由以下4步来描述。(1)执行“控制变量初始化语句(yj)”,使控制变量获得一个初值。(2)判断控制变量是否满足“条件表达式”,若满足条件则执行一遍循环体,否则结束整个for语句(yj),继续执行for循环下面的句子。(3)根据增量表达式,计算出控制变量所得到的新值(4)自动转到第(2)步。第2页/共30页第二页,共31页。第一节for语句(yj)三、语句格式举例三、语句格式举例 (1) (1)将控制变量从将控制变量从1 1变到变到100100,增量为,增量为1 1 for(i=1;i=100;+i) for(i=1;i=1;-i)for(i=7;

3、i=77;i+=7) 即for(i=7;i=2;i-=2)for(int j=99;j=0;j-=11)for(int i=1,j=2;i=99&j=100;i+=2,j+=2)需要说明的是:可以在for循环“ 控制变量初始化语句”中声明变量(如上面最后3个例子),这些变量只在for循环结构(jigu)中有效,离开了该for结构(jigu),变量就无效了。 第3页/共30页第三页,共31页。第一节for语句(yj)利用利用forfor循环循环, ,计算计算(j sun)(j sun)输出输出1+2+1001+2+100的和的和#include using namespace std;int m

4、ain () int sum=0; for (int i=1; i=100 ; +i) sum+=i; cout sum;return 0;第4页/共30页第四页,共31页。第一节for语句(yj)例例4.1 4.1 输出输出11001100之间所有之间所有(suyu)(suyu)偶数。偶数。#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

5、;return 0;return 0; 第5页/共30页第五页,共31页。第一节for语句(yj)例例4.3 4.3 利用利用forfor循环计算循环计算n n!的值。!的值。分析:分析:n n!1*2*3*n1*2*3*n#include #include using namespace std;using namespace std;int main ()int main () long long s; /Noip2010 long long s; /Noip2010开始开始C+C+语言中语言中long longlong long类型允许使用类型允许使用 int n; /n int n;

6、/n不能定义为不能定义为long longlong long,否则,否则forfor语句死循环语句死循环 s=1; s=1; cinn; cinn; for (int i=1; i=n ; +i) / for (int i=1; i=n ; +i) /若若s s定义为定义为intint,当,当n=13n=13时时s s的值就溢出了的值就溢出了 s*=i; s*=i; cout s; cout =13n=13时,时,s s值超过了值超过了intint类型的表示范围。还有一种比类型的表示范围。还有一种比intint更大的类型,称为更大的类型,称为long longlong long,它的表示范围是

7、,它的表示范围是-263-263263-1263-1,比,比-1019-101910191019略窄,而我们一直使用的略窄,而我们一直使用的intint范围是范围是-231-231231-1,231-1,只比只比-2*109-2*1092*1092*109略宽。略宽。 输入输出输入输出long longlong long也可以借助于也可以借助于printfprintf和和scanfscanf语句,但对应的占位符却是和平台与编译器相关的:在语句,但对应的占位符却是和平台与编译器相关的:在linuxlinux中,中,gccgcc很统一的用很统一的用%lld%lld;在;在windowswindow

8、s中,中,MinGWMinGW的的gccgcc和和VC6VC6都需要用都需要用%I64d%I64d;但;但VS2008VS2008却是用却是用%lld%lld。第6页/共30页第六页,共31页。第一节for语句(yj)例例4.4 4.4 利用利用forfor循环循环, ,分别计算分别计算11001100中奇数的和、偶数的和。中奇数的和、偶数的和。#include #include using namespace std;using namespace std;int main ( )int main ( ) int jssum=0; int jssum=0; int ossum=0; int

9、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 cout the sum of odd numbers 1 toto 100 is : jssumendl; 100 is : jssumendl; cout the sum of even numbers 1 cout the sum of e

10、ven numbers 1 toto 100 is : ossumendl; 100 is : ossumendl; return 0; return 0; 说明:说明: 我们也可以在我们也可以在forfor循环初始化或增值表达式部分中放一条以上循环初始化或增值表达式部分中放一条以上(yshng)(yshng)的语句,中间用逗号隔开。的语句,中间用逗号隔开。第7页/共30页第七页,共31页。【上机练习(linx)4.1】1、求12+22+32+1002。2、计算100之内所有(suyu)的偶数之和。3、求s=1+1/2+1/3+1/100。4、求10个数中的最大值和最小值。5、按字母表的顺序,

11、从字母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,第8页/共30页第八页,共31页。第二节while语句(yj)一、语句一、语句(yj)(yj)格式格式格式格式1 1 说明:循环体部分由多个语句构成,应由一对花括号括起来,构成一个语句块的形式。说明:循环体部分由多个语句构成,应由一对花括号括起来,构成一个语句块的形式。程序风格提示:写程序风格提示:写whilewhile循环语句时,循环体的语句相对循环语句时,循环体的语句相对(xingdu)(xingd

12、u)于于whilewhile缩进两格。缩进两格。说明:语句说明:语句1是是while循环语句的循环体,它将在满足条件的情况下被重复执行。循环语句的循环体,它将在满足条件的情况下被重复执行。格式格式2第9页/共30页第九页,共31页。第二节while语句(yj)二、语句执行过程二、语句执行过程(1)(1)计算作为循环控制条件表达式的值,得到逻辑真或假,假定用计算作为循环控制条件表达式的值,得到逻辑真或假,假定用M M表示。表示。(2)(2)若若M M为真,则执行了一遍循环体,否则离开循环,结束整个为真,则执行了一遍循环体,否则离开循环,结束整个whilewhile语句的执行。语句的执行。(3)(

13、3)循环体的所有语句执行结束后,自动转向第循环体的所有语句执行结束后,自动转向第(1)(1)步执行。步执行。三、格式举例三、格式举例(1) i=0;(1) i=0; while (i10) while (ix;(2) cinx; while while(x0xx; cinx;功能:当输入功能:当输入(shr)(shr)的数据小于的数据小于0 0时,重复读数据。时,重复读数据。第10页/共30页第十页,共31页。第二节while语句(yj)例例4.5 4.5 求求s=1 +2 +3+ns=1 +2 +3+n,当加到第几项时,当加到第几项时,s s的值会超过的值会超过(chogu)1000(cho

14、gu)1000?程序程序(chngx)(chngx)如下:如下: #include #include using namespace std;using namespace std;int 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; system(“pause); system(“pause); return 0; return 0; 第11页/共30页第十一页,共31页。第二节while语句(yj)例例4.6 4.6 求

15、两个正整数,的最大公约数。求两个正整数,的最大公约数。分析:求两个整数的最大公约数可以采用辗转相除法。以下是辗转相除法的算法:分别用分析:求两个整数的最大公约数可以采用辗转相除法。以下是辗转相除法的算法:分别用m m,n n,r r表示表示(biosh)(biosh)被除数、除数、余数;被除数、除数、余数;1)1)求求m 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除以除

16、以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 % 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最大公约数最大公

17、约数=nendl;=n=51+ 1/2 + 1/3 +1/n =5的最小的最小n n值。值。分析:此题不等式的左边是一个求和的算式,该和式中的数据项个数是未知的,也正是要求出的。对于分析:此题不等式的左边是一个求和的算式,该和式中的数据项个数是未知的,也正是要求出的。对于(duy)(duy)和式中的每个数据项,对应的通式为和式中的每个数据项,对应的通式为1/i1/i,i=1i=1,2 2,nn。所以可采用循环累加的方法来计算出它的值。设循环变量为所以可采用循环累加的方法来计算出它的值。设循环变量为i i,它应从,它应从1 1开始取值,每次增加开始取值,每次增加1 1,直到和,直到和式的值不小于

18、式的值不小于5 5为止,此时的为止,此时的i i值就是所求的值就是所求的n n。设累加变量为。设累加变量为s s,在循环体内把,在循环体内把1/i1/i的值累加到的值累加到s s上。上。根据以上分析,采用根据以上分析,采用whilewhile循环编写出程序如下:循环编写出程序如下:#include #include using namespace std;using namespace std;int main ()int main () int i=0; int i=0; float s=0; float s=0; while(s5) / while(s5) /当当s s的值还未超过的值还未

19、超过5 5时时 +i; +i; s+=1.0/i; s+=1.0/i; couti; couti; system(“pause); system(“pause); return 0; return 0; 若采用若采用forfor循环循环(xnhun)(xnhun)来写,则如下所示:来写,则如下所示:#include #include using namespace std;using namespace std;int main ()int main () int i; int i; float s=0; float s=0; for(i=1;s5;+i) for(i=1;s5;+i) s+=

20、1.0/i; s+=1.0/i; couti-1; couti-1; system(“pause); system(“pause); return 0; return 0; 第13页/共30页第十三页,共31页。【上机练习(linx)4.2】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,其规律是从第三项起,

21、每项均等于前两项之和。求前30项,并以每行5个数的格式(gshi)输出。第14页/共30页第十四页,共31页。第三节do-while语句(yj)一、语句一、语句(yj)(yj)格式格式格式格式1 1说明:语句说明:语句(yj)1(yj)1是是do-whiledo-while的循环体。的循环体。格式格式2 2说明:循环体部分由多个语句构成,应由一对花括号括起来,构成一个语句块的形式。说明:循环体部分由多个语句构成,应由一对花括号括起来,构成一个语句块的形式。二、语句执行过程二、语句执行过程(1)(1)执行一遍循环体。执行一遍循环体。(2)(2)求出作为循环条件的求出作为循环条件的“条件表达式条件

22、表达式”的值,若为逻辑值真则自动转向第的值,若为逻辑值真则自动转向第(1)(1)步,否则结束步,否则结束dodo循环的执行过程,继续循环的执行过程,继续执行其后面的语句。执行其后面的语句。在在dodo语句的循环体中也可以使用语句的循环体中也可以使用breakbreak语句,用它来非正常结束循环的执行。语句,用它来非正常结束循环的执行。第15页/共30页第十五页,共31页。第三节do-while语句(yj)三、实例三、实例例例4.9 4.9 对于求两个正整数,的最大公约数可以用对于求两个正整数,的最大公约数可以用dowhiledowhile实现。实现。代码如下,请完善代码如下,请完善(wnshn

23、)(wnshn): #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;ret

24、urn 0; 第16页/共30页第十六页,共31页。第三节do-while语句(yj)例例4.10 4.10 求求19921992个个19921992的乘积的末两位数是多少?的乘积的末两位数是多少?【分析】积的个位与十位数只与被乘数与乘数的个位与十位数字有关,所以本题相当于求【分析】积的个位与十位数只与被乘数与乘数的个位与十位数字有关,所以本题相当于求19921992个个9292相乘相乘(xin chn)(xin chn),而且本次的乘积是下一次相乘,而且本次的乘积是下一次相乘(xin chn)(xin chn)的被乘数,因此也只需取末的被乘数,因此也只需取末两位参与运算就可以了。两位参与运算

25、就可以了。 #includeusing namespace std;int main() int a=1,t=0; do +t; a=(a*92)%100; while (t!=1992); coutaendl; return 0;第17页/共30页第十七页,共31页。第三节do-while语句(yj)例例4.11 4.11 校体操队到操场集合校体操队到操场集合, ,排成每行排成每行2 2人人, ,最后多出最后多出1 1人人; ;排成每行排成每行3 3人人, ,也多出也多出1 1人人; ;分别按每行排分别按每行排4,5,64,5,6人人, ,都多出都多出1 1人人; ;当排成每行当排成每行7

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

27、e#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; if (x%5!=1) yes=

28、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进行判断时,都得到进行判断时,都得到“通过通过”(此处不赋假值)才能保持真值。(此处不赋假值)才能保持真值。第18页/共

29、30页第十八页,共31页。【上机练习(linx)4.3】1 1、用、用do-whiledo-while循环完成如下循环完成如下3 3题:题:求求s=1+2+3+4+10s=1+2+3+4+10求求s=1+1/2+1/3+1/100s=1+1/2+1/3+1/100计算计算n n!,其中!,其中n n由键盘输入。由键盘输入。2 2、读一组实数、读一组实数, ,遇零终止遇零终止, ,打印其中正、负数的个数及各自的总和。打印其中正、负数的个数及各自的总和。3 3、用辗转相除法、用辗转相除法(chf)(chf)求两个自然数的最大公约数。求两个自然数的最大公约数。4 4、找出被、找出被2 2、3 3、5

30、 5除时余数为除时余数为1 1的最小的十个数。的最小的十个数。5 5、将一根长为、将一根长为369cm369cm的钢管截成长为的钢管截成长为69cm69cm和和39cm39cm两种规格的短料。在这两种规格的短料至少各截一两种规格的短料。在这两种规格的短料至少各截一根的前提下根的前提下, , 如何截才能余料最少?如何截才能余料最少?第19页/共30页第十九页,共31页。第四节循环(xnhun)嵌套 例例4.12 4.12 求求 S=1!+2!+3!+.+10! S=1!+2!+3!+.+10! 分析:这个问题是求分析:这个问题是求1010以内自然数的阶乘之和,可以用以内自然数的阶乘之和,可以用f

31、orfor循环来实现。程序结构如下:循环来实现。程序结构如下: for(i=1;i=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 显然显然(xinrn)(xinrn)根据以上结构,通过根据以上结构,通过1010次的循环可以求出次的循环可以求出1 1!,2 2!,!,10!,10!,并不断累加起来,求出并不断累加起来,求出s s。而求。而求t=i!,t=i!,又可以用一又可以用一个个forfor循环来实现:循环来实现: t=1; t=1; for

32、(j=1;j=i;+j) for (j=1;j=i;+j) t*=j; t*=j;第20页/共30页第二十页,共31页。因此整个程序因此整个程序(chngx)(chngx)为:为:#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!

33、i! t*=j; t*=j; s+=t; / s+=t; /累加累加i!i! couts; couts; return 0; return 0; 以上程序以上程序(chngx)(chngx)是一个是一个forfor循环的嵌套。这种方法是比较容易想到的,但实际上对于求循环的嵌套。这种方法是比较容易想到的,但实际上对于求i i!,!,我们可以根据求出的(我们可以根据求出的(i-1i-1)!乘上)!乘上i i即可得到,而无需重新从即可得到,而无需重新从1 1再累乘到再累乘到i i。第四节 循环(xnhun)嵌套第21页/共30页第二十一页,共31页。第四节循环(xnhun)嵌套因此程序因此程序(ch

34、ngx)(chngx)可改为可改为: :#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;+i) for(int i=1;i=10;+i) t*=i; /t t*=i; /t为上一个数的为上一个数的i-1i-1的阶乘值,再乘以的阶乘值,再乘以i i即为即为i!i! s+=t; / s+=t; /累加累加i!i! couts; couts; return 0; return 0; 显然第二个程序显然第

35、二个程序(chngx)(chngx)的效率要比第一个高得多。第一个程序的效率要比第一个高得多。第一个程序(chngx)(chngx)要进行要进行1+2+3+10=551+2+3+10=55次循次循环,而第二程序环,而第二程序(chngx)(chngx)进行进行1010次循环。若题目中求的是次循环。若题目中求的是1 1!+2+2!+1000+1000!,则两个程序!,则两个程序(chngx)(chngx)的效率区别更明显。的效率区别更明显。第22页/共30页第二十二页,共31页。第四节循环(xnhun)嵌套例例4.13 4.13 一个炊事员上街采购,用一个炊事员上街采购,用500500元钱买了元

36、钱买了9090只鸡,其中母鸡一只只鸡,其中母鸡一只1515元元, ,公鸡一只公鸡一只1010元,小鸡一只元,小鸡一只5 5元,正元,正好把钱买完。问母鸡,公鸡,小鸡各买了多少只?好把钱买完。问母鸡,公鸡,小鸡各买了多少只?【分析】设母鸡【分析】设母鸡i i只只, ,公鸡公鸡j j只只, ,则小鸡为则小鸡为90-i-j90-i-j只只, ,则则15*i+ 10* j+(90-i-j)*5=500,15*i+ 10* j+(90-i-j)*5=500,显然一个方程求两个未知数显然一个方程求两个未知数是不能直接求解。必须组合出所有可能是不能直接求解。必须组合出所有可能(knng)(knng)的的i,

37、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) / /枚举母鸡的数量枚举母鸡的数量 for (int j=0;j=50;+j) / for (int j=0;j=50;+j) /枚举公鸡的数量枚举公鸡

38、的数量 k=90-i-j; k=90-i-j; if (15*i+10*j+k*5=500) if (15*i+10*j+k*5=500) cout cout母鸡有母鸡有ii只只,公鸡有公鸡有jj只只,小鸡有小鸡有kk只只 endl; endl; return 0;return 0; 第23页/共30页第二十三页,共31页。第四节循环(xnhun)嵌套例例4.14 4.14 利用利用forfor循环循环(xnhun)(xnhun)语句输出图语句输出图4-14-1中的三角形。中的三角形。* *图图4-14-1#include #include using namespace std;using

39、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) /输出输出(shch)(shch)一行中的一行中的* *数数 cout*; cout*; coutendl; / coutendl; /换行换行 return 0;return 0; 第24页/共30页第二十四页,共31页。第四节循环(xnhun)嵌套例例4.15 4.15 求求100100999999中的水仙花

40、数。若三位数中的水仙花数。若三位数ABCABC,ABC=A3+B3+C3ABC=A3+B3+C3,则称,则称ABCABC为水仙花数。为水仙花数。例如例如153153,13+53+33=1+125+27=15313+53+33=1+125+27=153,则,则153153是水仙花数。是水仙花数。【分析】【分析】 根据根据(gnj)(gnj)题意,采用三重循环来求解。由于循环次数一定,用题意,采用三重循环来求解。由于循环次数一定,用forfor循环最为简单。程序如循环最为简单。程序如下:下:#include#include#include /#include /调用调用setwsetw函数需注明使

41、用该库函数需注明使用该库using 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*a*a+b*b*b+c*c*c=a*100+b*10+c) if (a*a*a+b*b*b+c*c*c=a*100+b*10+c) coutsetw(6)a*100+

42、b*10+c; /setw coutsetw(6)a*100+b*10+c; /setw函数控制输出场宽函数控制输出场宽 return 0;return 0; 运行结果:运行结果:153153370370371371407407第25页/共30页第二十五页,共31页。第四节循环(xnhun)嵌套同时也可以采用一个同时也可以采用一个for循环循环(xnhun)来求解,表面上看好像优于三重循环来求解,表面上看好像优于三重循环(xnhun),实际上却比上面的程序效率低,请同学们自己分析。实际上却比上面的程序效率低,请同学们自己分析。程序如下:程序如下:#include#includeusing na

43、mespace std;int main() int a,b,c; for (int m=100; 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;第26页/共30页第二十六页,共31页。第四节循环(xnhun)嵌套例例4.16 4.16 输出输出100200100200中所有的素数。中所有的素数。分析:我们可对分析:我们可对100-200100-200之间的每一个整数进行之间的每一个整数进行(jnxng)(j

44、nxng)判断,若它是为素数,则输出。判断,若它是为素数,则输出。而对于任意整数而对于任意整数i i,根据素数定义,我们从,根据素数定义,我们从2 2开始,到开始,到sqrtsqrt(i i),找),找i i的第一个约数,若找的第一个约数,若找到第一个约数,则到第一个约数,则i i必然不是素数。必然不是素数。程序如下:程序如下:#include #include #include /#include /在在Dev C+Dev C+中可调用数学函数库中可调用数学函数库cmathcmathusing namespace std;using namespace std;int main ()int

45、main () int x; int x; for (int i=100;i=200;+i) for (int i=100;i=200;+i) x=2; x=2; while(x=floor(sqrt(i)&(i%x!=0) /floor while(xfloor(sqrt(i) if ( xfloor(sqrt(i) coutit; coutit; return 0;return 0; 第27页/共30页第二十七页,共31页。第四节循环(xnhun)嵌套例例4.17 4.17 输出所有形如输出所有形如aabbaabb的四位完全平方数(即前两位数字相等,后两位数字也相等)。的四位完全平方数(即

46、前两位数字相等,后两位数字也相等)。【分析】【分析】分支和循环结合在一起时威力特别强大:我们枚举所有可能的分支和循环结合在一起时威力特别强大:我们枚举所有可能的aabbaabb,然后判断它们是否为完全平方数。注意,然后判断它们是否为完全平方数。注意,a a的范围是的范围是1 19 9,b b可以是可以是0 0。主程序。主程序(chngx)(chngx)如下:如下: 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(%d

47、n,aabb);) printf(%dn,aabb);另一个思路是枚举平方根另一个思路是枚举平方根x x,参考程序,参考程序(chngx)(chngx)如下:如下:#include#includeint main()int main() int n=0,hi,lo;int n=0,hi,lo;for (int x=1 ; ; +x) /for (int x=1 ; ; +x) /可以直接从可以直接从x=32x=32开始枚举开始枚举 n=x*x;n=x*x; if (n1000) continue;if (n9999) break;if (n9999) break; hi = n/100;hi

48、= 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); return 0; return 0; 第28页/共30页第二十八页,共31页。【上机练习(linx)4.4】1 1、求、求s=11+22+33+.+NN s=11+22+33+.+NN 2 2、求、求s=1+1/2!+1/3!+1/10!s=1+1/2!+1/3!+1/10!3 3、输入一个整数,若是素数,输出、输入一个整数,若是素数,输

49、出“YES”“YES”,否则输出,否则输出“NO”“NO”4 4、任给一个自然数、任给一个自然数n n,求出这个自然数不同因数的个数。,求出这个自然数不同因数的个数。 如:如:n=6n=6时,因为时,因为1 1,2 2,3 3,6 6这四个数均是这四个数均是6 6的因数,故输出为的因数,故输出为total=4total=4。5 5、输入一列图形(字母金字塔)、输入一列图形(字母金字塔) a a a b a b a b c a b c . . . . a b c y z a b c y z6 6、把一张一元钞票换成一分,二分和五分的硬币,每种至少一枚。问有哪几种换法?、把一张一元钞票换成一分,二

50、分和五分的硬币,每种至少一枚。问有哪几种换法?7 7、百鸡问题:一只公鸡值、百鸡问题:一只公鸡值5 5元,一只母鸡值元,一只母鸡值3 3元,而元,而1 1元可买元可买3 3只小鸡。现有只小鸡。现有100100元钱,想买元钱,想买100100只鸡。问可买公鸡、母鸡、小鸡各几只?只鸡。问可买公鸡、母鸡、小鸡各几只?8 8、某人想将手中的一张面值、某人想将手中的一张面值100100元的人民币换成元的人民币换成1010元、元、5 5元、元、2 2元和元和1 1元面值的票子。要求元面值的票子。要求(yoqi)(yoqi)换正好换正好4040张,且每种票子至少一张。问:有几种换法?应适当张,且每种票子至少

51、一张。问:有几种换法?应适当考虑减少重复次数。考虑减少重复次数。9 9、有一堆、有一堆100100多个的零件,若三个三个数,剩二个;若五个五个数,剩三个;若七个七个数,剩五个。请你编一个程序计算出这堆零件至少是多少个?多个的零件,若三个三个数,剩二个;若五个五个数,剩三个;若七个七个数,剩五个。请你编一个程序计算出这堆零件至少是多少个?1010、编写一程序,验证角谷猜想。所谓的角谷猜想是:、编写一程序,验证角谷猜想。所谓的角谷猜想是:“对于任意大于对于任意大于1 1的自然数的自然数n n,若,若n n为奇数,则将为奇数,则将n n变为变为3*n+13*n+1,否则将,否则将n n变为变为n n

52、的一半。经过若干次这样的变的一半。经过若干次这样的变换,一定会使换,一定会使n n变为变为1 1。”1111、哥德巴赫猜想(任何充分大的偶数都可由两个素数之和表示)。将、哥德巴赫猜想(任何充分大的偶数都可由两个素数之和表示)。将4-1004-100中的所有偶数分别用两个素数之和表示。输出为:中的所有偶数分别用两个素数之和表示。输出为:4=2+24=2+26=3+36=3+3100=3+97100=3+97第29页/共30页第二十九页,共31页。感谢您的欣赏(xnshng)!第30页/共30页第三十页,共31页。内容(nirng)总结第一节 for语句。(1)执行“控制变量初始化语句”,使控制变量获得(hud)一个初值。(3)控制变量从7变到77,增量为7。第5页/共30页。第6页/共30页。第9页/共30页。第11页/共30页。排成每行3人,也多出1人。4、任给一个自然数n,求出这个自然数不同因数的个数。若五个五个数,剩三个。第29页/共30页。感谢您的欣赏第三十一页,共31页。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号