




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第4章
循環(huán)結(jié)構(gòu)目錄while語句do…while語句for語句break/continue語句多重循環(huán)算法執(zhí)行效率216:12實(shí)際應(yīng)用中經(jīng)常遇到需要反復(fù)執(zhí)行某些固定操作序列的情形,循環(huán)結(jié)構(gòu)正是為此而設(shè)置的控制結(jié)構(gòu),這些需反復(fù)執(zhí)行的固定操作序列就定義為循環(huán)體。當(dāng)程序運(yùn)行到循環(huán)語句時(shí),若循環(huán)語句的條件判定結(jié)果為真,則選擇執(zhí)行循環(huán)體然后再判斷循環(huán)條件,否則便跳出該循環(huán)轉(zhuǎn)而運(yùn)行下一條語句。因此,循環(huán)結(jié)構(gòu)的本質(zhì)可歸結(jié)為循環(huán)判斷執(zhí)行的選擇結(jié)構(gòu)。316:121.while語句while語句是C/C++語言的一種基本循環(huán)模式,若條件為真則執(zhí)行循環(huán)體,當(dāng)條件為假時(shí)跳出循環(huán)執(zhí)行后續(xù)語句。while的一般格式為:while(表達(dá)式)循環(huán)體while語句的功能是:若表達(dá)式為真(非0值為真)則執(zhí)行循環(huán)體;然后再重新判斷表達(dá)式,…;如此周而復(fù)始,直至表達(dá)式為假(0值為假)則跳出該循環(huán)。因此while語句本質(zhì)上相當(dāng)于循環(huán)判斷執(zhí)行的單分支if語句。while語句的執(zhí)行流程圖如圖4.1所示。while語句中,循環(huán)體可以是一個(gè)簡(jiǎn)單語句,也可以是一個(gè)復(fù)合語句(用{}括起的多條語句),甚至是一條空語句;表達(dá)式可以是關(guān)系表達(dá)式、邏輯表達(dá)式,甚至是數(shù)值表達(dá)式。返回416:12例4.1:求m+(m+1)…+n。輸入:兩個(gè)正整數(shù)m和n(m<=n)。輸出:m加到n的和。#include<iostream>usingnamespacestd;intmain(){ intm,n; cin>>m>>n; inti=m,sum=0; while(i<=n) { sum=sum+i; i++; } cout<<sum<<endl; return0;}516:12例4.2:輸入多組整數(shù),每組數(shù)據(jù)包含兩個(gè)整數(shù)a和b,對(duì)每組數(shù)據(jù)輸出a+b的結(jié)果。輸入:多組整數(shù)。
輸出:對(duì)每組數(shù)據(jù)輸出a+b的結(jié)果。#include<iostream>usingnamespacestd;intmain(){ inta,b;
while(cin>>a>>b) //可以“while(scanf("%d%d",&a,&b)!=EOF)”替代 cout<<a+b<<endl; return0;}616:122.do…while語句do...while語句首先無條件執(zhí)行一次循環(huán)體,然后再判斷循環(huán)條件,若條件為真則再次執(zhí)行循環(huán)體,……,直至循環(huán)條件為假則跳出循環(huán)。do...while語句的一般格式為:do
循環(huán)體while(表達(dá)式);do...while語句的循環(huán)體可以是一個(gè)簡(jiǎn)單語句,也可以是一個(gè)復(fù)合語句,甚至是一條空語句。do...while語句的執(zhí)行流程圖如圖4.2所示。do...while語句和while語句非常相似,但后者是當(dāng)型循環(huán),前者是直到型循環(huán)。do-while語句保證其循環(huán)體至少會(huì)執(zhí)行一次;但是在while語句中,若起始時(shí)表達(dá)式為假則循環(huán)體一次也不會(huì)執(zhí)行。不過,若開始時(shí)表達(dá)式為真,則do...while和while效果完全相同。返回716:12例4.3:輸入正整數(shù)n,求使1+2+…+i>=n成立的最小i。輸入:一個(gè)正整數(shù)n。輸出:使1+2+…+i>=n成立的最小i。#include<iostream>usingnamespacestd;intmain(){ intn,i=0,sum=0; cin>>n; do { i++; sum=sum+i; }while(sum<n); cout<<i<<endl; return0;}816:123.for語句for語句是C/C++的第三種循環(huán)控制實(shí)現(xiàn)方式。for語句的一般格式為:for([表達(dá)式1];[表達(dá)式2];[表達(dá)式3])循環(huán)體表達(dá)式1是for語句執(zhí)行的開始部分,通常用于為循環(huán)控制變量賦初值,僅在for語句運(yùn)行開始時(shí)執(zhí)行一次;表達(dá)式2是for語句執(zhí)行的結(jié)束部分,與while的判斷表達(dá)式作用一致,用于設(shè)置for語句是否執(zhí)行循環(huán)體的判斷條件;表達(dá)式3常用于每次執(zhí)行循環(huán)體后改變循環(huán)變量值,以使for語句能趨向于結(jié)束。for語句的執(zhí)行流程圖如圖4.3所示。for語句的循環(huán)體可以是一條簡(jiǎn)單語句,也可以是一個(gè)復(fù)合語句,甚至是一條空語句。for語句中的三個(gè)表達(dá)式均可省略,但應(yīng)在其它相應(yīng)位置有同等效用的功能實(shí)現(xiàn)。與while和do…while語句相比,for語句將循環(huán)變量賦初值、循環(huán)條件判斷、循環(huán)變量修改三個(gè)操作濃縮體現(xiàn)在一對(duì)小括號(hào)中,不僅適用于循環(huán)次數(shù)確定的情形,也適用于循環(huán)次數(shù)不確定的情形,使用起來更為方便靈活,因而是一種使用更為廣泛的循環(huán)控制語句。返回916:12例4.4:輸入一個(gè)正整數(shù)n,判定它是否為素?cái)?shù)(prime,又稱質(zhì)數(shù))。輸入:一個(gè)正整數(shù)n。輸出:若n為質(zhì)數(shù)則輸出“Yes”,否則輸出“No”。#include<cstdio>#include<cmath>intmain(){ intn,i,k,flag=1; scanf("%d",&n); if(n==1)flag=0; k=sqrt(n); for(i=2;i<=k;i++) { if(n%i==0)flag=0; } if(flag==1)printf("Yes\n"); elseprintf("No\n"); return0;}1016:12
輸入:一個(gè)整數(shù)n。
輸出:1-2/3+3/5-4/7+5/9-6/11+...的前n項(xiàng)和。#include<cstdio>intmain(){ intn,i; doubleitem,num,deno,sum=0,flag=-1; scanf("%d",&n); for(i=1;i<=n;i++) { num=i; deno=2*i-1; flag=-flag; item=flag*num/deno; sum=sum+item; } printf("%.3lf",sum); return0;}1116:124.break/continue語句break語句和continue語句均用于改變循環(huán)執(zhí)行的狀態(tài),但兩者的含義和執(zhí)行效用不同。break語句用于強(qiáng)制中斷所屬循環(huán)(若為for語句則表達(dá)式3也將不再運(yùn)行);continue語句用于跳過本次循環(huán)中還未運(yùn)行的余下語句轉(zhuǎn)而開始下一輪循環(huán)判斷(若為for語句則執(zhí)行表達(dá)式3后再開始下一輪循環(huán)判斷)。返回1216:12例4.6:輸入一個(gè)正整數(shù)n,判定它是否為素?cái)?shù)(prime,又稱質(zhì)數(shù))。輸入:一個(gè)正整數(shù)n。
輸出:若n為質(zhì)數(shù)則輸出“Yes”,否則輸出“No”。#include<iostream>#include<cmath>usingnamespacestd;intmain(){ intn,i;
cin>>n; intk=sqrt(n); for(i=2;i<=k;i++) if(n%i==0)break; if(n==1||i<=k)cout<<"No\n"; elsecout<<"Yes\n"; return0;}1316:12例4.7:輸出a到b之間的不能被3整除的整數(shù)。輸入:兩個(gè)正整數(shù)a、b。輸出:a到b之間的不能被3整除的整數(shù)。#include<iostream>usingnamespacestd;intmain(){ inta,b,i; cin>>a>>b; for(i=a;i<=b;i++){ if(i%3==0)continue; cout<<i<<""; }return0;}1416:125.多重循環(huán)循環(huán)語句的循環(huán)體內(nèi)又包含了另一循環(huán)語句,則稱為多重循環(huán)或循環(huán)的嵌套。例4.8:公雞五文一只,母雞三文一只,小雞一文三只,m文錢買m只雞,三種雞各買多少只?
輸入:m。輸出:公雞、母雞和小雞的只數(shù)(若有多個(gè)解則僅輸出字典序最小的解)。#include<iostream>usingnamespacestd;intmain(){ intm,x,y,z; cin>>m; for(x=0;x<=m/5;x++) for(y=0;y<=m/3;y++){ z=m-x-y; if(5*3*x+3*3*y+z==3*m){ cout<<x<<""<<y<<""<<z<<endl; return0; } }return0;}返回1516:12例4.9:求a到b之間存在多少個(gè)素?cái)?shù)。輸入:兩個(gè)正整數(shù)a、b。輸出:a到b之間的全部素?cái)?shù)的個(gè)數(shù)。#include<iostream>#include<cmath>usingnamespacestd;intmain(){ inta,b,i,j,k,ans=0; cin>>a>>b; for(i=a;i<=b;i++){
k=sqrt(i); for(j=2;j<=k;j++)
if(i%j==0)break; if(j>k)ans++; } cout<<ans<<endl;return0;}1616:12例4.10:公雞五文錢一只,母雞三文錢一只,小雞一文錢三只,用m文錢買m只雞,公雞、母雞、小雞各買多少只?輸入:一個(gè)正整數(shù)m。輸出:若有解只輸出一個(gè)解,即公雞數(shù)量最少的那個(gè)解;若無解輸出“Noanswer”。#include<iostream> //解法1usingnamespacestd;intmain(){ intm,i,j,k,noAnswer=1; cin>>m; for(i=0;i<=m/5;i++){ for(j=0;j<=m/3;j++){ k=m-i-j; if(i*15+j*9+k==m*3){ //找到一個(gè)解
cout<<i<<""<<j<<""<<k<<endl; //輸出解 noAnswer=0; //無解標(biāo)志置0 break; //結(jié)束內(nèi)層循環(huán),即j控制的循環(huán) } } if(noAnswer==0)break; //若已找到解,結(jié)束由i控制的循環(huán)
} if(noAnswer==1)cout<<"Noanswer"<<endl; return0;}1716:12#include<iostream> //解法2usingnamespacestd;intmain(){ intm,i,j,k,noAnswer=1; cin>>m; for(i=0;i<=m/5;i++){ for(j=0;j<=m/3;j++){ k=m-i-j; if(i*15+j*9+k==m*3) { //找到一個(gè)解
cout<<i<<""<<j<<""<<k<<endl; //輸出解 noAnswer=0; //無解標(biāo)志置0 gotoloop; //使用goto語句直接跳轉(zhuǎn)到整個(gè)循環(huán)之后的語句 } } } loop:if(noAnswer==1)cout<<"Noanswer"<<endl; return0;}1816:126.算法執(zhí)行效率算法是對(duì)特定問題的解決方法的求解步驟描述,程序是依據(jù)算法思想采用某種編程語言書寫的具體代碼。一個(gè)算法具有有窮性、確定性、可行性、輸入、輸出5大特性。(1)有窮性:一個(gè)算法應(yīng)在有限步驟之內(nèi)結(jié)束;(2)確定性:算法的每一步驟應(yīng)清晰準(zhǔn)確無歧義;(3)可行性:算法中的任何步驟均可分解為基本的可執(zhí)行操作;(4)輸入:一個(gè)算法有0個(gè)或多個(gè)輸入,以從外界獲取所需的必要信息;(5)輸出:一個(gè)算法有一個(gè)或多個(gè)輸出,以反映對(duì)輸入數(shù)據(jù)加工處理后的結(jié)果。一個(gè)好的算法應(yīng)達(dá)到以下目標(biāo):(1)正確性:分為語法正確和邏輯正確兩個(gè)層面;(2)可讀性:便于人閱讀、有助于閱讀者對(duì)算法的理解;(3)健壯性:對(duì)任意非法輸入應(yīng)該有合適的處理策略;(4)高效性:花費(fèi)較少的時(shí)間代價(jià)和空間代價(jià)。返回1916:12
2016:12時(shí)間復(fù)雜度與執(zhí)行時(shí)間
時(shí)間復(fù)雜度計(jì)算所得數(shù)值限時(shí)1秒1000000游刃有余10000000勉勉強(qiáng)強(qiáng)100000000僅限循環(huán)體非常簡(jiǎn)單的情況2116:12如何測(cè)量程序的運(yùn)行時(shí)間?#include<time.h>#include<iostream>//#include<bits/stdc++.h>usingnamespacestd;intmain(){ inti,k=0; intn=1e8; clock_tstart,end; start=clock(); for(i=0;i<n;i++) k++; end=clock(); cout<<(double)(end-start)/CLOCKS_PER_SEC<<endl;}2216:12
#include<iostream>usingnamespacestd;intmain(){ intm,n; cin>>m>>n; intresult=1; while(n!=0){ if(n%2==1)result=result*m%1007; n=n/2; //等價(jià)于n>>=1; m=m*m%1007; } cout<<result<<endl;
return0;}2316:12例4.12:輸入一個(gè)正整數(shù),輸出其位數(shù)(用while語句實(shí)現(xiàn))。
輸入:一個(gè)正整數(shù)。
輸出:正整數(shù)的位數(shù)。#include<iostream>usingnamespacestd;intmain(){ intn,num=0; cin>>n; while(n>0) { n=n/10; num++; } cout<<num<<endl; return0;}2416:12例4.13:給定一個(gè)整數(shù),請(qǐng)將該數(shù)各個(gè)數(shù)位上的數(shù)字反轉(zhuǎn)得到一個(gè)新數(shù)。新數(shù)也應(yīng)滿足整數(shù)的常見形式,即除非給定的原數(shù)為零,否則反轉(zhuǎn)后得到的新數(shù)的最高位數(shù)字不應(yīng)為零。
輸入:一個(gè)十進(jìn)制整數(shù)。(-690)
輸出:對(duì)應(yīng)的反轉(zhuǎn)數(shù)。(-96)#include<iostream>usingnamespacestd;intmain(){ intx,y=0; cin>>x; while(x!=0) { y=y*10+x%10; x=x/10; } cout<<y; return0;}2516:12例4.14:小明買了許多圣誕禮物準(zhǔn)備用于班級(jí)活動(dòng),回家后感覺太累了,便讓機(jī)器人小靈幫忙數(shù)一下禮物一共有多少份。但是小靈不喜歡數(shù)字4,因此每次數(shù)到4時(shí)便跳過該數(shù)。例,若小靈數(shù)到639時(shí),下一份禮物小靈就會(huì)數(shù)650。輸入:一個(gè)整數(shù)num,表示小靈給出的禮物的份數(shù),1<num<1000,且一定不含整數(shù)4。
輸出:一個(gè)整數(shù)為禮物的實(shí)際份數(shù)。#include<iostream>usingnamespacestd;intmain(){ intnum,w=1,sum=0; cin>>num; while(num>0) { intb=num%10; if(b>4)b--; sum=sum+b*w; w=w*9; num=num/10; } cout<<sum<<endl; return0;}2616:12例4.15:分解質(zhì)因數(shù)。
輸入:一個(gè)正整數(shù)n。(36)
輸出:n的質(zhì)因數(shù)的乘積形式。(2*2*3*3)#include<iostream>usingnamespacestd;intmain(){ intn,i=2; cin>>n; while(n!=1) { while(n%i==0) { cout<<i; n=n/i; if(n!=1)cout<<"*"; } i++; } return0;}2716:12例4.16:輸入n和a,求a+aa+aaa+…aa…a(n個(gè)a),如當(dāng)n=3,a=2時(shí),2+22+222=246。
輸入:包含兩個(gè)整數(shù),n和a,含義如上述,n和a都是小于10的非負(fù)整數(shù)。
輸出:輸出前n項(xiàng)和,單獨(dú)占一行。#include<iostream>usingnamespacestd;intmain(){ intn,a,sum=0; cin>>n>>a; intitem=0; for(inti=1;i<=n;i++) { item=item*10+a; sum=sum+item; } cout<<sum<<endl; return0;}2816:12例4.17:媽媽給了小明m元零花錢,為了鼓勵(lì)小明節(jié)約,說如果小明每天只消費(fèi)1元,每花k元就可以得到1元額外獎(jiǎng)勵(lì),如果聽媽媽的話小明最多可以花多少天?
輸入:輸入2個(gè)整數(shù)m、k(1<k<m<1000)。
輸出:輸出一個(gè)整數(shù),表示m元可以消費(fèi)的天數(shù)。#include<iostream>usingnamespacestd;intmain(){ intm,k; cin>>m>>k; intsum=0; while(m>=k) { sum=sum+(m–m%k); m=m/k+m%k; } sum=sum+m; cout<<sum<<endl;
return0;}2916:12例4.18:輸入一個(gè)正整數(shù)n。輸出n!的最高位上的數(shù)字。
輸入:輸入一個(gè)正整數(shù)n(n<=1000)。
輸出:輸出n!的最高位上的數(shù)字。#include<iostream>#include<cmath>usingnamespacestd;intmain(){ intn,i; doubles=0;
cin>>n; for(i=1;i<=n;i++) s=s+log10(i); s=s-int(s); s=pow(10,s);
cout<<int(s)<<endl;
return0;}3016:12例4.19:有一輛智能小車,最初(時(shí)間為0)的位置為(0,0),我們想知道它最后的位置。小車以每小時(shí)10公里的速度向北移動(dòng)(北為y軸正向,東為x軸正向)。小車會(huì)收到一系列依照時(shí)間戳記排序的命令,1表示“向左轉(zhuǎn)”,2表示“向右轉(zhuǎn)”,3表示“停止”。每個(gè)命令的前面有一個(gè)時(shí)間戳記,所以知道該命令是何時(shí)發(fā)出的。最后一個(gè)命令一定是“停止”。另外假設(shè),這輛小車非常靈活,它可以在瞬間轉(zhuǎn)彎例,小車在時(shí)間為5時(shí)收到一個(gè)“向左轉(zhuǎn)”的命令1,在時(shí)間10收到一個(gè)“向右轉(zhuǎn)”的命令2,在時(shí)間15收到一個(gè)“停止”的命令3。那么在最后時(shí)間15時(shí),小車的位置將在(-50,100)。程序只要求輸出小車最后的位置,第一個(gè)整數(shù)是x坐標(biāo),第二個(gè)整數(shù)是y坐標(biāo)。輸入:輸入包含多個(gè)命令,每個(gè)命令由整數(shù)time和command組成,表示在時(shí)刻time發(fā)出命令command。command的取值范圍1-3,含義如上所述。輸出:輸出占一行,包含兩個(gè)整數(shù),表示小車的最終位置。兩個(gè)整數(shù)之間由空格隔開。3116:12#include<iostream>usingnamespacestd;intmain(){ intx=0,y=0; intcommand; //存儲(chǔ)命令號(hào) intpreTime=0,curTim
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 老年旅游意外保險(xiǎn)經(jīng)紀(jì)合作協(xié)議
- 校園智能安防系統(tǒng)租賃與安全演練及維護(hù)協(xié)議
- 知識(shí)產(chǎn)權(quán)變更及商標(biāo)權(quán)轉(zhuǎn)讓協(xié)議
- 職業(yè)規(guī)劃師企業(yè)員工職業(yè)規(guī)劃指導(dǎo)合同
- 抖音東盟市場(chǎng)短視頻版權(quán)授權(quán)合同
- 虛擬現(xiàn)實(shí)主題公園游客安全保障協(xié)議
- 股權(quán)補(bǔ)償款擔(dān)保及股權(quán)激勵(lì)計(jì)劃變更實(shí)施協(xié)議
- 知識(shí)產(chǎn)權(quán)改編與權(quán)益補(bǔ)充協(xié)議
- 高端住宅宿管員服務(wù)與規(guī)范合同
- 股權(quán)重組稅務(wù)籌劃與財(cái)務(wù)報(bào)表編制合作協(xié)議
- 續(xù)簽采購(gòu)合同范本(標(biāo)準(zhǔn)版)
- 智能垃圾分類箱項(xiàng)目投資商業(yè)計(jì)劃書范本(投資融資分析)
- 2025至2030中國(guó)胸腺法新行業(yè)深度調(diào)查及投資前景研究報(bào)告
- 國(guó)有企業(yè)合同管理辦法3篇
- 2025-2030中國(guó)調(diào)光玻璃行業(yè)規(guī)模走勢(shì)及投資可行性分析研究報(bào)告
- 《明朝的邊疆政策》課件
- 湖北省武漢市2025屆高中畢業(yè)生四月調(diào)研考試生物試題及答案(武漢四調(diào))
- 技術(shù)合作協(xié)議范本
- 2025年度建筑施工安全演練計(jì)劃
- 托幼機(jī)構(gòu)十項(xiàng)衛(wèi)生保健制度
- 電費(fèi)優(yōu)化與節(jié)約的管理方法及其應(yīng)用分析報(bào)告
評(píng)論
0/150
提交評(píng)論