循環(huán)結(jié)構(gòu)程序設(shè)計典型例題_第1頁
循環(huán)結(jié)構(gòu)程序設(shè)計典型例題_第2頁
循環(huán)結(jié)構(gòu)程序設(shè)計典型例題_第3頁
循環(huán)結(jié)構(gòu)程序設(shè)計典型例題_第4頁
循環(huán)結(jié)構(gòu)程序設(shè)計典型例題_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、循環(huán)結(jié)構(gòu)程序設(shè)計典型例題例1:有數(shù)列2/3、4/5、6/9、10/15求此數(shù)列前30項的和。算法分析: 對于數(shù)列的題,首先要找出通項公式,或前后項的計算關(guān)系公式,根據(jù)公式求所需。由于數(shù)列的題一般執(zhí)行次數(shù)能確定,用for語句來編寫比較方便。 此題,前后項的關(guān)系是:后一項的分子是前一項的分母加1,后一項的分母是前一項的分子加分母。解題思路是用循環(huán)語句求各項,并把值累加,因為是求前30項的和,循環(huán)執(zhí)行30次。1. 初值i=2,j=3,s=0;2. 用n從1到30循環(huán)3. s=s+ i/j; 4. c=i; i=j+1; j=c+j;5.輸出s;程序:#include<stdio.h>ma

2、in( ) int i=2,j=3,n,c; float s=0; for(n=1;n<=30;n+) s=s+(float)i/j; c=i; i=j+1; j=c+j; printf(“n%f”,s);此題中的n與循環(huán)體中的執(zhí)行語句沒有數(shù)值上的聯(lián)系,僅僅用做決定循環(huán)執(zhí)行的次數(shù)。例2:下面這個程序,想想它實現(xiàn)的是什么功能?#include<stdio.h>main( ) int i,s=0; for(i=1;i<=100;i+) if(i%5=0) continue; s=s+i; printf(“n%d”,s);在左邊的程序中,i從1到100循環(huán),當(dāng)i是5的倍數(shù)時,

3、直接進入下一個i,當(dāng)i不是5的倍數(shù)時,把i累加到s, 最后輸出s。 所以,這個程序?qū)崿F(xiàn)的是求1100中間所有非5的倍數(shù)的數(shù)之和。例3:輸出nm中(0<n<m)能被3整除,且至少有一個數(shù)字是5的所有數(shù)。算法分析:1 輸入n與m的值 2 用整型變量a從n-m循環(huán),每次值加13.若a能被3整除,執(zhí)行第4步,否則執(zhí)行第9步4令整型變量x=a5.若x>0,執(zhí)行第6步,否則執(zhí)行第9步6.i=x%107.若i值不為5,執(zhí)行第8步,否則輸出a,并執(zhí)行第9步8.x=x/10,并返回第5步9.返回第2步,察看下一個a程序:#include<stdio.h>main( ) long a

4、,x,i,t,n,m; scanf(“%ld%ld”,&n,&m); for(a=n;a<=m;a+) if(a%3=0) x=a; while(x>0) i=x%10; if(i=5) printf(“t%ld”,a);break; x=x/10; 問:能把a%3=0也放到for循環(huán)語句的表式2中,寫成a<=m&&a%3=0嗎?答:不可以!例4:求3-150中所有素數(shù)的和。算法分析:1.用變量a從3到150循環(huán),每次值增加12.用變量i從2到a-1循環(huán),每次值增加13.若a%i=0 ,結(jié)束i的循環(huán),執(zhí)行第4步4.若i=a,把a累加到s上。 5

5、.輸出s的值 注意:此題中執(zhí)行第4步時有兩種情況。第一種:在第3步中發(fā)現(xiàn)了滿足a%i=0的情況,直接跳出了i的循環(huán),此時的i一定是在2到a-1中間的一個值,而且a不是素數(shù)。第二種:一直沒有發(fā)現(xiàn)滿足a%i=0的i,在i=a時,不再滿足i循環(huán)的執(zhí)行條件,i循環(huán)結(jié)束,此時的a是素數(shù)!程序:#include<stdio.h>main( ) int a,s=0,i; for(a=3;a<=150;a+) for(i=2;i<=a-1;i+) if(a%i=0) break; if(a=i) s=s+a; printf(“n%d”,s)求素數(shù)的方法很多,大同小異。此題可以做一些改動

6、。如:i的值可以是從2取到sqrt(a);可以不用最后察看i的值,而是通過在發(fā)現(xiàn)因子時改動標(biāo)志變量,最后根據(jù)標(biāo)志變量的值判斷是否是素數(shù)。例5:有一個八層高的燈塔,每層所點燈數(shù)都等于上一層的兩倍,一共有765盞燈,求塔底燈數(shù)。算法分析: 此題的關(guān)鍵在于塔頂?shù)臒魯?shù),只要知道了塔頂?shù)臒魯?shù),就可知道塔底燈數(shù)。這里采取試探的方法來求塔頂燈數(shù)。 設(shè)塔頂燈數(shù)為x,x的初值從1開始循環(huán),每次值加1。求出相應(yīng)的燈的總數(shù),總數(shù)不為765,繼續(xù)下一個x的循環(huán),直到某次求得燈總數(shù)為765時,結(jié)束x的循環(huán),輸出此時塔底燈數(shù)。1.x從1開始循環(huán),每次值加 1 2.設(shè)k初值x,計算每層燈數(shù)。設(shè)s初值0,累加每層燈數(shù)3. i

7、從1到8循環(huán),每次值加14. s=s+ k; k=k*2;5.如果s=765 ,結(jié)束x的循環(huán)4. s=s+ k; k=k*2;程序:#include<stdio.h>main( ) int x,s,i,k; for(x=1;x+) s=0; k=x; for(i=1;i<=8;i+) s=s+k;k=k*2; if(s=765) break; printf(“n%d”,k/2);例5:已知a>b>c>0,a、b、c為整數(shù),且a+b+c<100,求滿足1/a2+1/b2=1/c2的a、b、c共有多少組?算法分析:這是一道典型的三重嵌套循環(huán)的題目。a、b、

8、c都是位于1到99之間整數(shù)。編程的基本思路是:找出1到99之間的所有a、b、c的排列,察看同時滿足a>b>c、a+b+c<100、1/a2+1/b2=1/c2這三個條件的a、b、c有多少組。值得注意的是, 1/a2+1/b2=1/c2這個條件并不能簡單的原樣照寫,因為在求分?jǐn)?shù)的過程中必然有四舍五入,不能得出真正的準(zhǔn)確的結(jié)果,必須把條件變形成:c2(a2+b2)=a2b2才能得出正確的結(jié)果。1.a從1到99循環(huán)2.b從1到99循環(huán)3.c從1到99循環(huán)4.若a>b&&b>c&&a+b+c<100&&c*c*(a*a

9、+b*b)=a*a*b*b,統(tǒng)計找到了一組5.輸出找到的組數(shù)程序:#include<stdio.h>main( ) long a,b,c,n=0;for(c=1;c<=97;c+) for(b=c+1;b<=98;b+) for(a=b+1;a<=99;a+) if(a+b+c<100&&c*c*(a*a+b*b)=a*a*b*b) n+; printf(“n%ld”,n);特別注意此題中變量不能定義成int型。此題可做改進,在循環(huán)時確保a>b>c,而不需要再在if中判斷。改進如下所示:for(a=1;a<=99;a+) f

10、or(b=1;b<=99;b+) for(c=1;c<=99;c+) if(a>b&&b>c&&a+b+c<100 &&c*c* (a*a+b*b)=a*a*b*b) n+;例6:e=1+1/1!+1/2!+.+1/n!(精度為1e-6)分析:用變量e求和,e初值為1。用變量t求階乘,t初值為1。用變量i從1開始累加循環(huán),t=t*i,e=e+1.0/t。#include<stdio.h>void main( ) int i=1; long t=1; float e=1; while(e-(int)e>

11、;=1e-6) t=t*i; e=e+1.0/t; i+; printf(“n%.10f”,e); 例7:數(shù)列 1,1,2,3,5,8. 有f(n)=f(n-1)+f(n-2),f(1)=1,f(2)=1,求f(40)。分析:用 變量f1、f2、f作為數(shù)列相鄰的三項,初值f1=1,f2=1。用變量n從3到40循環(huán),f=f1+f2,f1=f2,f2=f.#include<stdio.h> main( ) long f1=1,f2=1,f,n; for( n=3;n<=40;n+) f=f1+f2; f1=f2; f2=f; printf(“nf=%ld”,f); 思考:求14萬

12、之內(nèi)的最大的f(n).例8: Sn=1-1/3+1/5-1/7+1/(2n-1) 求s(100)(保留4位小數(shù))分析:用變量s求和,s初值為0。用變量n從1到100循環(huán),如果n是奇數(shù)(n%2!=0),s=s+1/(2*n-1),否則s=s-1/(2*n-1) 。#include<stdio.h> main( )int n;float s=0;for( n=1;n<=100;n+)if(n%2!=0) s=s+1.0/(2*n-1)else s=s-1.0/(2*n-1);printf(“n%.4f”,s);例9:用牛頓迭代法求方程f(x)=2x3-4x2+3x-7=0在x=2

13、.5附近的實根,直到滿足|xn-xn-1|<10-6為止。牛頓迭代公式為:xn=xn-1-f(xn-1)/f (xn-1)算法分析:牛頓迭代法認(rèn)為,以任意一個x的初值開始,都可以根據(jù)牛頓迭代公式xn=xn-1-f(xn-1)/f(xn-1)求出一串x的序列,這個序列將越來越趨向于某一個值,這個值就是方程f(x)的一個實根。#include<stdio.h>#include<math.h>main( ) float x=2. 5,x0,f,f2; do x0=x; f=2*x0*x0*x0-4*x0*x0+3*x0-7; f2=6*x0*x0-8*x0+3; x=x

14、0-f/f2; while(fabs(x-x0)>=10e-6); printf(“%f”,x);例10:求1000以內(nèi)最大的20個素數(shù)之和。分析:用變量s求和,s初值為0。用變量I統(tǒng)計以求得素數(shù)的個數(shù),I初值為0。用變量a從1000到1循環(huán),如果a是素數(shù),則s=s+a,I+。當(dāng)i值等于20時,跳出循環(huán)。main( )int a,s=0,I=0, j;for( a=1000;a>=1;a-)for( j=2;j<a;j+) if(a%j=0) break; if( j=a) s=s+a; I+; if(I=20) break; printf(“n%d”,s);例11:200,

15、1000的雙胞胎數(shù)的對數(shù)。雙胞胎數(shù):兩素數(shù)差為2稱為雙胞胎數(shù)。分析:用變量n統(tǒng)計以求得雙胞胎數(shù)的對數(shù),n初值為0。用變量a從200到998循環(huán),如果a是素數(shù),則令變量b=a+2,如果b也是素數(shù),則n值增1。素數(shù)求法同前,用變量I 循環(huán)。main( )int a,b,n=0,I;for(a=200;a<=998;a+) for(I=2;I<a;I+) if(a%I=0) break; if(a=I ) b=a+2; for(I=2;I<b;I+) if(b%I=0) break; if(b=I ) n+; printf(“n%d”,n);例12:求10,200間可以被其因子的個

16、數(shù)整除的整數(shù)的個數(shù)。分析:用變量n統(tǒng)計所求的整數(shù)個數(shù),n初值為0。用變量a從10到200循環(huán),如果a可以被其因子的個數(shù)整除,則n值增1。判斷a是否可以被其因子的個數(shù)整除:用變量c求a的因子的個數(shù),c初值為0,用變量I從1到a循環(huán),如果a%I=0,則c值增1。得出c值后,若a%c=0,則a是所求整數(shù)。main( )int a,c,n=0,I;for( a=10;a<=200;a+) c=0; for(I=1;I<=a;I+) if( a%I=0) c+; if(a%c=0) n+; printf(“nn=%d”,n);例13:求1000以內(nèi)最大的完數(shù)。完數(shù)就是其真因子的和等于其本身的

17、數(shù)。分析:用變量a從1000到1循環(huán),如果a等于其真因子的和,則循環(huán)結(jié)束。判斷a是否等于其真因子的和:用變量s求a的真因子的和,s初值為0,用變量I從1到a-1循環(huán),如果a%I=0,則s=s+i。得出s值后,若a=s,則a為所求。main( ) int a,I,s;for(a=1000;a>=1;a-) s=0; for(I=1;I<a;I+) If(a%I=0) s=s+I; if(a=s) break; printf(“n%d”,a);思考:求1000以內(nèi)所有完數(shù)的和。例14: S=sqrt(ln(1)+ln(2)+ln(n),n=50(結(jié)果保留6位小數(shù))分析:開平方數(shù)及自然對數(shù)都是math.h函數(shù)庫中已定義的函數(shù)??捎胣從1到50循環(huán)直接求得。注意函數(shù)定義的數(shù)據(jù)類型。#include<stdio.h>#include “math.h”main( )double s,a=0,n;for( n=1;n<=50;n+)a=a+l

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論