c语言习题---(循环语句)
這里寫目錄標(biāo)題
- 前言
- 題目目錄
- 非編程題
- 編程題
- 第一題解析
- 第二題解析
- 第三題解析
- 第一題解析
- 第二題解析
- 第三題解析
- 第四題詳解
- 第五題解析
- 第六題解析
- 第七題解析
- 第八題解析
- 第九題解析
- 第十題解析
前言
從這一章開始我們的題就多起來了,因?yàn)榍懊娴姆种дZ句,啊不管怎么出類型就那樣,但是我們的循環(huán)語句就復(fù)雜一些,我們就多來點(diǎn)題目好吧廢話不多說先看題。
題目目錄
非編程題
第一題:
#include<stdio.h> int main() {int n = 0;while (n++ <= 2);printf("%d\n", n);return 0; }第二題:
#include<stdio.h> int main() {int x = 0;int y = 0;for (y = 1; y < 10;){y = ((x = 3 * y, x + 1), x - 1);printf("x=%d,y=%d", x, y);}return 0; }第三題:
#include<stdio.h> int main() {int n = 2;int k = 0;while (k++ && n++ > 2);{printf("%d %d\n", k, n);} return 0; }編程題
第1題:
第2題:
第3題:
第4題:
第5題:
第6題:
第7題:
第8題:
第9題:
第十題:
第一題解析
#include<stdio.h> int main() {int n = 0;while (n++ <= 2);printf("%d\n", n);return 0; }我們來這段代碼,我們這道題的目的就是提醒大家n++的區(qū)別,首先可以看到我們一開始將n初始化為0,然后我們就進(jìn)入了while循環(huán)的判斷部分,我們來看這個(gè)判斷部分的內(nèi)容是n++<=2,那么這里我就有個(gè)問題來問大家,我們是將n之前的值跟2進(jìn)行比較?還是將n++之后的值來跟2比較?這里我就直接跟大家說,因?yàn)檫@里的++是后置++,所以我們是先將n之前的值來跟2進(jìn)行比較,比完之后再將n的值再加上1 ,如果我們這里改一下改成++n的話,那么我們這里就是將n加1之后的值·,再來跟2進(jìn)行比較。好這時(shí)候可能就有小伙伴們放松警惕了給出了類似1 2 3 4 這樣的答案,但是小伙伴發(fā)現(xiàn)了沒,我們這里的while語句后面是直接加一個(gè)分號(hào)的,這說明了什么我們這里是空語句也就是while循環(huán)里面的循環(huán)體什么都沒有,所以我們這里的printf語句是等while循環(huán)結(jié)束之后再執(zhí)行的,所以這里的printf語句就只會(huì)執(zhí)行一次,那么來看while循環(huán)結(jié)束之后我們的n等于多少,首先我們來看當(dāng)n等于2的時(shí)候我們來執(zhí)行判斷語句,首先這里的2==2判斷為真,就會(huì)執(zhí)行了下面的循環(huán)體于此同時(shí)n的值也就會(huì)變成3,因?yàn)檠h(huán)體為空,所以我們就又來到了while循環(huán)的判斷部分,因?yàn)檫@里的n等于3 所以我們就會(huì)判斷為假,所以就會(huì)跳出循環(huán),但是因?yàn)檫@里為n++,所以跳出循環(huán)的同時(shí)n的值會(huì)再加上1 ,所以這里的n就變成了4,所以再執(zhí)行下面的printf語句的時(shí)候就會(huì)打印出4 。
第二題解析
#include<stdio.h> int main() {int x = 0;int y = 0;for (y = 1; y < 10;){y = ((x = 3 * y, x + 1), x - 1);printf("x=%d,y=%d", x, y);}return 0; }我們這題主要是來帶大家看看逗號(hào)表達(dá)式在這里的運(yùn)算,首先我們來回顧一下逗號(hào)表達(dá)式的知識(shí)點(diǎn):1.逗號(hào)表達(dá)式的運(yùn)算順序是從做向右計(jì)算2.逗號(hào)表達(dá)式的值為逗號(hào)最右邊表達(dá)式的指。那我們?cè)賮砜催@道題首先y的值初始化為1 ,然后判斷部分判斷為真就進(jìn)入for循環(huán)的循環(huán)體里面,好我們來看這個(gè)循環(huán)體的內(nèi)容為y = ((x = 3 * y, x + 1), x - 1);我們首先來看右邊的內(nèi)容他是一個(gè)逗號(hào)表達(dá)式因?yàn)槎禾?hào)表達(dá)式是從最左邊開始吧,那么我們就來看最左邊,這時(shí)候我們就發(fā)現(xiàn)這個(gè)最左邊的表達(dá)式它也是一個(gè)逗號(hào)表達(dá)式,那么這里就是一個(gè)逗號(hào)表達(dá)式里面嵌套一個(gè)逗號(hào)表達(dá)式,那我們就看最里面的逗號(hào)表達(dá)式:首先最左邊的表達(dá)式意思是將y的值乘以3然后再賦值給x,那么我們這里的y是1 乘以3就變成了3所以我們這里的x就變成了3,然后我們?cè)賮砜聪乱粋€(gè)表達(dá)式x+1,那么我們這里就變成了4,所以我們里面的逗號(hào)表達(dá)式的結(jié)果就變成了4,然后就執(zhí)行外層的逗號(hào)表達(dá)式的表達(dá)式2 ,它是x-1,又因?yàn)閤的值為3所以這個(gè)外層的逗號(hào)表達(dá)式的結(jié)果就為2 ,然后賦值給y,那么我們第一層循環(huán)下來我們的y=2,x=3,進(jìn)入for循環(huán)的判斷部分,判斷為真,那么繼續(xù)執(zhí)行下面的循環(huán)體部分,有了第一次循環(huán)的經(jīng)驗(yàn)我們發(fā)現(xiàn)這里的兩個(gè)逗號(hào)表達(dá)式可以將其化簡為先x=3y然后y=x-1,大家可以想想是不是這個(gè)意思,那么這樣的話我們這里就簡單了,因?yàn)榈谝淮窝h(huán)之后y的值變成了2,所以第二次循環(huán)x就等于6,y就等于5,進(jìn)入第三循環(huán)x就等于3y等于15,然后x就等于了14,進(jìn)入判斷部分發(fā)現(xiàn)不成立就跳出循環(huán)執(zhí)行printf語句,那么我們這里打印的結(jié)果就變成了x=15 y=14,看到這里大家應(yīng)該能夠明白這里的意思,然后大家發(fā)現(xiàn)了沒有我們這里的for循環(huán)的表達(dá)式3是省略了的,因?yàn)槲覀兿旅娴难h(huán)體可以改變y的值,所以我們這里的表達(dá)式3也就可以省略,而且也不會(huì)造成死循環(huán)。
第三題解析
#include<stdio.h> int main() {int n = 2;int k = 0;while (k++ && n++ > 2);printf("%d %d\n", k, n);return 0; }其實(shí)我們的第三題和第一題有 那么點(diǎn)相似,啊這時(shí)候就有小伙伴們會(huì)說啦,啊葉超凡啊你這是在水文章吧,搞兩個(gè)相似的文章上來,啊大家千萬別誤會(huì)了,我們這里還是有個(gè)地方值得大家學(xué)習(xí)的,首先我們這里將n初始化為2,k初始化為0,然后就進(jìn)入了while語句的判斷部分,首先我們看到這里有個(gè)&&操作符它的兩邊的表達(dá)式都為真的時(shí)候整個(gè)表達(dá)式才能判斷為真,首先會(huì)判斷左邊的表達(dá)式,這時(shí)我們發(fā)現(xiàn)它是k++這是一個(gè)后置++,那我們這里是先判斷k再來++,因?yàn)槲覀兊膋一開始為0所以我們左邊就判斷為假,然后k再++,但是我們這里是&&它的左邊為假的話,那么不管右邊的表達(dá)式判斷結(jié)果如何整個(gè)表達(dá)式都會(huì)為假,所以我們的編譯器就不會(huì)執(zhí)行右邊的表達(dá)式,所以這里的n++就不會(huì)執(zhí)行,所以n的值就不會(huì)改變,又因?yàn)閣hile后面有分號(hào)所以就會(huì)執(zhí)行下面的printf語句,所以我們這里打印出來的值為1 2 .同理哈我們還有個(gè)操作符||這個(gè)跟&&是同樣的道理,當(dāng)||左邊的表達(dá)式判斷為真的時(shí)候就不會(huì)執(zhí)行右邊的表達(dá)式,大家這里要注意別搞錯(cuò)了。看到?jīng)]沒水文章吧。
第一題解析
第1題:
首先我們這里求解的是n的階乘,那么我們這里肯定是先得輸入一個(gè)n的值的,然后再來計(jì)算這個(gè)值的階乘,那么這里就來看如何計(jì)算這個(gè)值的階乘,其實(shí)我們之前做個(gè)一個(gè)類似的題,就是計(jì)算累加從1一直加到n,我們當(dāng)時(shí)的代碼時(shí)長這樣的:
我們是先創(chuàng)建一個(gè)變量i,并且將其初始化為1,表示的是從1開始一直往后加,然后每次循環(huán)都會(huì)使得i的值加上1 ,然后我們還創(chuàng)建了一個(gè)變量n,表示該循環(huán)要循環(huán)的次數(shù),那么我們這里也就表示的從1開始累加,累加到n為止,這些都完成了那么我們這里就還剩下一個(gè)問題就是,如何把這些累加給儲(chǔ)存下來?那么我們這里就可以這樣,再創(chuàng)建一個(gè)變量sum,將其初始化為0,每次循環(huán)之后將sum的值加上i的值再賦值給sum,這樣我們就可以將每次累加的值儲(chǔ)存起來,這里我們可以梳理一下一開始sum的值為0,i的值為1 ,那么經(jīng)過第一次循環(huán)sum的值就等于0+1=1,i++,i就等于2,再經(jīng)歷一次循環(huán),因?yàn)樵谏弦淮窝h(huán)之后sum的值就變成了1,所以在第二次循環(huán)的時(shí)候sum的值就變成了1+2=3,同理第三次循環(huán)sum的值就等于1+2+3=6,第四次循環(huán)sum的值就變成了1+2+3+4=10后面就以此類推。我們就可以得到任何一個(gè)數(shù)累加的值,那么我們看這里是累加的,那我們的階乘是累乘,所以我們這里就可以照葫蘆畫瓢,我們將變量sum改成變量multiply,并且將其初始化為1,然后每次循環(huán)的循環(huán)體改成multiply=multiply*i,這樣我們就可以將每次相乘的值存儲(chǔ)下來,這里我們可以推一下,一開始multiply的值為1 ,i的值也為1,那么相乘再賦值可以得到multiply還是1,然后i++,i就變成了2,再經(jīng)歷一次循環(huán),相乘再賦值multiply的值就變成了12=2,i的值也就變成了3,再經(jīng)歷一次循環(huán),相乘再賦值multiply的值就變成了了123=6,i的值就變成了4,再經(jīng)歷一次循環(huán),相乘再賦值multiply的值就變成了1234=24然后我們后面就可以依次類推,我們更具這個(gè)循環(huán)體就可以得到n的階乘的值。代碼如下:
#include<stdio.h> int main() {int i = 1;int multiply = 1;int n = 0;scanf("%d", &n);while (i <= n){multiply = multiply * i;i++;}printf("%d", multiply);return 0; }第二題解析
第2題:
我們上一題講到了n的階乘如何求解,那么我們這道題講解如何將這些階乘求和,那么我們這里能否將其看成兩個(gè)問題,一個(gè)是得到不同的階乘的值,另一個(gè)就是將這些值進(jìn)行累加,并且將其放到循環(huán)里面進(jìn)行實(shí)現(xiàn),這里我們可以使用一個(gè)內(nèi)部嵌套的循環(huán)的形式,外層循環(huán)用于計(jì)算階乘的相加,內(nèi)部的循環(huán)用于計(jì)算階乘的值,并且內(nèi)部的循環(huán)是放到實(shí)現(xiàn)階乘相加的前面,那么這里每一次外部循環(huán)就是先計(jì)算出階乘的值,再將其相加,這時(shí)候我們就有小伙伴們就反應(yīng)特別塊一下子寫出了代碼這里我們?yōu)榱朔奖阋稽c(diǎn)就改成計(jì)算到3的階乘:
其實(shí)大家可以運(yùn)行一下這段代碼,大家就會(huì)發(fā)現(xiàn)在這段代碼是有問題的,答案等于15,可能很多的小伙伴都不是很能理解哈,因?yàn)檫@個(gè)代碼很清楚很有道理,咋就出錯(cuò)了呢?對(duì)吧每次循環(huán)先計(jì)算階乘再把就階乘相加,這不是靠譜他媽給靠譜開門靠譜到了家嗎?咋就錯(cuò)了呢?好這里我就給大家詳細(xì)的一個(gè)一個(gè)的分析首先我們看階乘的概念是從1乘到指定數(shù),大家記住是從1開始
那我們我們就從循環(huán)開始一開始進(jìn)入for循環(huán)將n賦值為1,然后就進(jìn)入內(nèi)部的for循環(huán)將i賦值為1,因?yàn)檫@里的判斷條件為i<=n所以我們這里就只會(huì)循環(huán)一次multiply就等于11=1,然后就跳出來內(nèi)部的循環(huán),sum就等于0+1,好這里外部循環(huán)就執(zhí)行完了一次,n的值就變成了2 ,再繼續(xù)執(zhí)行內(nèi)部的for循環(huán),一開始將i初始化為1 ,然后根據(jù)判斷條件這里會(huì)循環(huán)兩次,第一次multiply=11 第二次multiply=12=2,然后就跳出了內(nèi)部循環(huán)下面的sum=1+2=3,好這時(shí)外部的for循環(huán)第二次就執(zhí)行完了,開始執(zhí)行第三次我們的n就變成了3,再進(jìn)入內(nèi)部的for循環(huán)將i初始化為1 ,根據(jù)判斷條件這里會(huì)循環(huán)三次,那我們來看第一次循環(huán),因?yàn)楦鶕?jù)我們第二次外部循環(huán)的結(jié)果我們這里的multiply為2 ,我們并沒將其初始化為其他的值,所以在外部第三次循環(huán)的內(nèi)部第一次循環(huán)我們的multiply=multiplyi=21=2,第二次multiply=22=4,第三次就是multiply=43=12,因?yàn)槲覀兩厦嬲f了階乘是從1開始的,而我們的第三次外部循環(huán)求3的階乘就變成了從2 開始也就是說從123變成了22*3=12所以這里就是我們?cè)斐慑e(cuò)誤的原因,那我們?nèi)绾芜M(jìn)行修改呢?我們可以在外部循環(huán)里面講multiply進(jìn)行一次賦值使得每次循環(huán)的開始都能保證multiply是從1開始的,那么我們的代碼如下:
這樣我們的結(jié)果就是對(duì)的了。當(dāng)然有些小伙伴們可能覺得這里嵌套的循環(huán)不是很好的想,那么我們這里就可以改一下代碼如下:
#include<stdio.h> int main() {int sum = 0;int multiply = 1;int i = 1;int n = 0;scanf("%d", &n);while (i <= n){multiply = multiply * i;//計(jì)算階乘sum = sum + multiply;//階乘相加i++;}printf("%d", sum);return 0; }那么這段代碼的運(yùn)行原理就是:我們3的階乘變成4的階乘的時(shí)候,我們是沒有必要再從1開始相乘的,我們可以直接在3的階乘基礎(chǔ)上直接乘以4 ,所以我們的代碼就可以這么寫。
第三題解析
第3題:
這題我也來給大家講兩個(gè)寫法好吧,啊有些小伙伴看到這個(gè)題的時(shí)候一下子就慌了,啊這是算出來的結(jié)果是小數(shù)啊,這我們?cè)趺茨艿玫叫?shù)啊,而且這里的循環(huán)一下子是正數(shù),一下子是負(fù)數(shù)這咋搞啊。大家不要慌哈,首先我們來解決小數(shù)的問題,我們之前在講初始c語言的時(shí)候說過這么一句話,叫當(dāng)我們這個(gè)(/)操作符的左右兩端只要有一個(gè)是小數(shù)的時(shí)候,我們得到的結(jié)果就是小數(shù),所以我們可以把這里的1改成1.0這樣得到的結(jié)果就是小數(shù),好這個(gè)問題解決了我們?cè)賮砜慈绾谓鉀Q這個(gè)減號(hào)的問題,我們這里就分為兩種解決的辦法
第一種:雖然這里有加號(hào)和減號(hào),但是這里的加減都是有規(guī)律的分母為偶數(shù)的話就為減,分母為奇數(shù)就為+,但是我們知道一件事就是偶數(shù)之間相差為2 ,奇數(shù)之間相差也為2 ,那么我們這里可以先計(jì)算出都是相加的情況就是1/1+1/2+1/3+1/4…+1/100,然后再減去兩倍的1/2+1/4+1/6+…1/100,如果是這樣的話,那就很簡單了嘛這不就是兩個(gè)循環(huán)嗎,而且第二個(gè)循環(huán)不就是講將i++改成i+=2嘛,那我們的代碼實(shí)現(xiàn)如下:
解法2
因?yàn)檫@里是一個(gè)正數(shù)接一個(gè)負(fù)數(shù),而且之前我們?cè)谥v操作符的時(shí)候提到過(-)這個(gè)操作符,可以使正數(shù)變成負(fù)數(shù),還可以使得負(fù)數(shù)變成正數(shù),那么我們這里可以創(chuàng)建一個(gè)變量signed并且將其初始化為1,每次計(jì)算的時(shí)候可以將它乘以變量i,在計(jì)算完之后在下面執(zhí)行signed=-signed這個(gè)操作,這樣就可以使得在下一次循環(huán)的時(shí)候signed變成負(fù)數(shù),他變成了負(fù)數(shù)也就表明這里變成了減號(hào),而且在下下次循環(huán)他又會(huì)變成正數(shù),那也就又變成了加號(hào)那么我們的代碼如下:
第四題詳解
第4題:
這題要我們求兩個(gè)數(shù)的最小公倍數(shù),那我們先來看看最小公倍數(shù)的概念是什么?首先創(chuàng)建兩個(gè)正整數(shù)a,b然后我們a和b的公倍數(shù)設(shè)為c,那么這個(gè)c%a是等于0的并且c%b也是等于0的,那么我們稱這個(gè)c為a和 b的公倍數(shù),其實(shí)c是有非常多的值的,比如說a*b這就是一個(gè)非常容易得到值,但是這只是其中一個(gè)我們這里要求這所有公倍數(shù)中最小的一個(gè),那么我們這里就將這個(gè)數(shù)稱為最小公倍數(shù)。這里我們給出兩種方法來球這個(gè)數(shù)
第一種:
其實(shí)大家可以在生活中發(fā)現(xiàn)這么一個(gè)規(guī)律就是:如果求解一個(gè)問題有多種方法的話,那么越是簡單的方法他的計(jì)算量越大,越是難以理解的方法他的計(jì)算量就越小,那么我們這里的第一種方法就是最簡單最容易想到的方法我們將他稱為窮舉法,首先我們要想的一個(gè)問題就是這個(gè)最小公倍數(shù)會(huì)不會(huì)比那兩個(gè)數(shù)都小肯定不會(huì),那么這個(gè)數(shù)會(huì)不會(huì)比這兩個(gè)數(shù)中的較大的數(shù)小,也不會(huì)那么這個(gè)數(shù)一定是比這兩個(gè)數(shù)都要大,那么我們就可以創(chuàng)建一個(gè)變量將他的值附值為最大的值,然后將這個(gè)變量%a和b,只要有一個(gè)%出來的值不等于0那么這個(gè)數(shù)就不是a和b的公倍數(shù),那么我們就將這個(gè)值加1,再繼續(xù)嘗試直到%a和b的值都等于0的時(shí)候,我們就可以找到公倍數(shù),并且那個(gè)數(shù)還是最小的,因?yàn)榍懊娴臄?shù)都不是公倍數(shù),那么我們這里就可以使用while循環(huán)后面表達(dá)式寫成(x%a!=0||x%b!=0)然后循環(huán)體里面就可以直接寫成x++來表示驗(yàn)證下一個(gè)數(shù)是不是最小公倍數(shù):
第二種方法:
其實(shí)大家可以感覺的到,我們的第一種方法十分的無腦,這不就是一個(gè)一個(gè)的找嘛,而且這個(gè)方法的效率也非常的低,那我們來看這個(gè)有沒有非常快的解決辦法,首先我們想啊,我們先創(chuàng)建一個(gè)變量n將其賦值為這兩個(gè)數(shù)的最大的一個(gè)數(shù),這里我們假設(shè)較大的數(shù)是a,較小的數(shù)是b,然后我們上一個(gè)方法是每次循環(huán)都加1 ,但是大家發(fā)現(xiàn)沒有其實(shí)這個(gè)1,他加的有點(diǎn)多余的,或者說加的有點(diǎn)小,那我們?cè)囍懿荒芗右粋€(gè)更大的數(shù)呢?每次都加一個(gè)更大的數(shù),是不是就可以更快的到達(dá)目的地,那這個(gè)更大的數(shù)如何來找呢?好我們一開始是將n賦值為啊a,那么這時(shí)候這個(gè)n%a是不是一定等于0,但是n%b就不一定吧,那么我們這個(gè)時(shí)候再讓n的值加a的話,是不是%上a還是等于0,兩倍嘛!但是%b的話是不是也不一定,但是我們這里是循環(huán)嘛,我們可以一直重復(fù)直到找到為止,那么這里可能有小伙伴感到疑惑為什么每次都加這個(gè)最大的數(shù)呢?加一個(gè)小一點(diǎn)的不行嗎?或者加個(gè)更大的不行嗎?大家這里可以這么想,我們之所以每次都加最大的數(shù)是因?yàn)槲覀円WC這個(gè)數(shù)首先得是a的倍數(shù),然后再來測試是否為b的倍數(shù),我們本來一開始就是a的倍數(shù)你加一個(gè)比a小的數(shù)他還能是a的倍數(shù)嗎?肯定就不是了嘛,好這時(shí)候有小伙伴們說那更大的呢?我一下子不能加2a嗎?它也可以保證是a的整數(shù)倍啊。那么這里確實(shí)是a的整數(shù)倍,我們不停的循環(huán)下去也確實(shí)是可以找到b的整數(shù)倍的數(shù),但是大家要記住我們這里要求的是最小公倍數(shù),一下子加兩倍的a的話很可能會(huì)導(dǎo)致找到了公倍數(shù)但不是最小的,所以大家這里要注意一下,看到這里大家應(yīng)該能夠明白這道題的做法了,我們來看一下代碼。
這里大家看的可能有點(diǎn)難受,這里主要是想讓大家熟悉一下條件操作符。
第五題解析
第5題:
上面講了如何求得最小公倍數(shù),那么我們這里來講講如何求得最大公約數(shù),大家感覺我這里的設(shè)計(jì)是不是還挺合理的。我們先來看看最大公約數(shù)的概念:這里我們就簡述一下:我們假設(shè)一個(gè)為x,如果m能整除x,并且n也能整除x,那么我們就稱x為m和n的公約數(shù)。當(dāng)然這個(gè)x有好多個(gè)數(shù),我們要求最大的,那么我們這里同樣有兩個(gè)方法來求解:
第一個(gè)方法:
首先創(chuàng)建一個(gè)變量x,那么我們首先可以知道的是x的值一定不會(huì)大于這兩個(gè)數(shù)的最小值的,那么我們就可以將這個(gè)數(shù)賦值為這個(gè)較小的數(shù),那么這樣我們就可以確定了x這個(gè)最大公約數(shù)的范圍,那么我們這里就可以一個(gè)一個(gè)的將其試出來,這里我們可以使用while循環(huán),且后面括號(hào)里面的表達(dá)式為
(a % i != 0 || b % i != 0)這個(gè)就可以來判斷是否為最大公約數(shù),并且每次循環(huán)都讓i的值減一,如果i的值等于1 的話,我們這里就用break跳出循環(huán),因?yàn)?就是下線了,這里跟上面的例子差不多這里大家可以參考上面的步驟照葫蘆畫瓢其代碼如下:
第二個(gè)方法:
這里我們就用輾轉(zhuǎn)相除法來寫這個(gè)題,但是我們這里就不介紹這個(gè)輾轉(zhuǎn)相除法的原理了,因?yàn)槲覀冞@里主要是要大家體會(huì)循環(huán)的運(yùn)用,那么輾轉(zhuǎn)相除法的運(yùn)算過程是:第一步:對(duì)于兩個(gè)整數(shù)m和n,使得m>n 。第二步:取余數(shù)r=m%n。第三步:若r=0,則n為取得的最大公約數(shù),否則執(zhí)行m=n;n=r;r=m%n。我們來舉一個(gè)例子吧,我們求24和18的最大公約數(shù),那么這里就m等于24,n等于18,r=24%18=6不等于0,那么就讓m=18,n等于6,再計(jì)算r的值r=18%6=0,所以我們這里的最大公約數(shù)就為n=6 。 那么我們這里就可以發(fā)現(xiàn)其實(shí)這里是有一個(gè)循環(huán)的,而且跳出循環(huán)的條件就是r=0,那么我們這里就可以使用while循環(huán),因?yàn)楫?dāng)r不等于0的時(shí)候我們會(huì)繼續(xù)輾轉(zhuǎn)相除,所以我們這個(gè)循環(huán)繼續(xù)的條件就是r!=0,那么我們就可以將這個(gè)表達(dá)式放到while后面的括號(hào)里面,那么這道題的思路也就非常的清楚了,首先輸入兩個(gè)值,然后再找到這兩個(gè)值的最大值,再用循環(huán)實(shí)現(xiàn)輾轉(zhuǎn)相除法,那么這道題的代碼如下:
這個(gè)方法是不是就比我們一個(gè)一個(gè)試來的快的多啊,那么我們這道題就說到這。
第六題解析
第6題:
我們來解個(gè)方程,這里我們根據(jù)高中的知識(shí)其實(shí)可以知道這里是個(gè)?,但是我們發(fā)現(xiàn)在這個(gè)園還非常的大,那么我們這里是很明顯不能將其一個(gè)一個(gè)的列出來的,但是我們這里可以使用循環(huán)結(jié)構(gòu)呀,我一個(gè)一個(gè)的嘗試很麻煩,但是電腦就很快啊,而且我們的方法還十分的簡單題目已經(jīng)告訴了我們計(jì)算的公式,首先我們知道這里是x方,和y方,然后要求的還是正整數(shù)的解,那么我們這里可以知道的是x的值肯定是小于45的,因?yàn)?5*45等于2025它已經(jīng)大于了1989,而且同理可得我們的y值它也是要小于45的,并且還是正整數(shù),那么x和y的值就是從1開始,那么我們這里是不是可以將所有的可能全部列出x是從1到45,y是從1到45,我們是不是就可以使用循環(huán)的嵌套將所有的坐標(biāo)到原點(diǎn)的距離全部算出來然后再與1989進(jìn)行比較如果等于的話就將其寫出來那么這里我們就可以使用循環(huán)的嵌套實(shí)現(xiàn),代碼詳細(xì)如下:
第七題解析
第7題:
首先我們來看看素?cái)?shù)的概念:數(shù)學(xué)上指在大于1的整數(shù)中只能被1和它本身整除的數(shù)。如2、3、5、7、11、43、109,那我們?nèi)绾吻蠼馑財(cái)?shù)呢?這里我們也可以使用窮舉法,比如說一個(gè)數(shù)n,我們要判斷他是不是素?cái)?shù),那么我們是不是可以用循環(huán)的方法將他除以大于1小于n-1的所有數(shù),如果發(fā)現(xiàn)其中只要有一個(gè)數(shù)能夠?qū)⑺?#xff0c;那么說明這個(gè)一定不是素?cái)?shù),如果所有的數(shù)都試完了,還是不能整除的話,就說明他是素?cái)?shù),那么我們的代碼如下:
#include<stdio.h> int main() {int n = 0;int i = 2;scanf("%d", &n);for (i = 2; i < n; i++)//一個(gè)一個(gè)的檢查是否為素?cái)?shù){if (n % i == 0)//判斷是否可以整除{printf("%d不是素?cái)?shù)\n", n);break;}}if (i == n)//判斷為素?cái)?shù){printf("%d是素?cái)?shù)", n);}return 0; }好一個(gè)數(shù)是否為素?cái)?shù)我們判斷完了,那么接下來我們就要將這些數(shù)全部都加起來,那么這里我們是不是可以在外面再加上一個(gè)循環(huán),這個(gè)循環(huán)就是產(chǎn)生2到n的各個(gè)值,并且外面這個(gè)外部循環(huán)還可以將所有的素?cái)?shù)加起來,那我們這里可以類比之前的題的做法,但是我們這里要加的數(shù)是素?cái)?shù),那么我們的代碼實(shí)現(xiàn)如下:
#include<stdio.h> int main() {int n = 0;int i = 2;int j = 0;int sum = 0;scanf("%d",&n);for (j = 2; j <= n; j++)//該循環(huán)的作用是產(chǎn)生2~n的數(shù){for (i = 2; i <j; i++)//該循環(huán)用于判斷是否為素?cái)?shù){if (j % i == 0){break;}}if (i==j)//判斷為素?cái)?shù)則將其相加{sum = sum +j;}}printf("%d", sum);return 0; }大家可以自己多多嘗試
第八題解析
第8題:
我們看到這道題,首先他給出了完數(shù)的概念,首先我們是不是得得出一個(gè)數(shù)的所有的因子,那么我們這里是不是就可以用到窮舉法,將這個(gè)數(shù)%上除了他自己本身以外的所有數(shù),如果%之后等于0那么就說明這個(gè)數(shù)是因子,那么我們這里求的是所有的因子,那么我們是不是得要一個(gè)循環(huán)來得出所有的因子,然后將所有的因子加起來,那么我們的代碼如下:
#include<stdio.h> int main() {int i = 0;int j = 0;int sum = 0;scanf("%d", &j);for (i = 1; i < j; i++)//列出所有的初速{if (j % i == 0)//判斷死否是因子{sum = sum + i;//將所有的因子相加}}if (sum == j)//判斷是否是完數(shù){printf("%d是完數(shù)\n", j);}else{printf("不是完數(shù)\n");}return 0; }好這里我們知道了如何判斷一個(gè)數(shù)是否為完數(shù),那么我們的題目的要求是將所有1000以內(nèi)的完數(shù)的和,那么我們這里就需要一個(gè)外層循環(huán)來列出所有的數(shù),再通過內(nèi)部循環(huán)篩選出完數(shù),再將他們?nèi)看蛴〕鰜?#xff0c;大家這里要注意一下,因?yàn)槲覀冞@里是循環(huán)的嵌套,所以我們每次外部循環(huán)執(zhí)行一次之后記得要將sum的值賦值為0,以確保下面的判斷能繼續(xù)執(zhí)行,那么我們的代碼如下:
#include<stdio.h> int main() {int i = 0;int j = 0;int sum = 0;for (j = 2; j <= 1000; j++){sum = 0;//大家注意這里要初始化for (i = 1; i < j; i++)//列出所有的初速{if (j % i == 0)//判斷死否是因子{sum = sum + i;//將所有的因子相加}}if (sum == j)//判斷是否是完數(shù){printf("%d是完數(shù)\n", j);}}return 0; }第九題解析
第9題:
我們?cè)賮砜匆幌逻@個(gè)題:首先我們可以看到這個(gè)題首先我們可以知道,每一項(xiàng)的分子為前一項(xiàng)的分子和分母的和,然后每一項(xiàng)的分母為前一項(xiàng)的分子,首先這個(gè)規(guī)則是從第二項(xiàng)開始的,那么我們這里的第一項(xiàng)是2/1,所以我們這里是不是就可以創(chuàng)建三個(gè)變量一個(gè)用來儲(chǔ)存分子,一個(gè)用來儲(chǔ)存分母,一個(gè)用來儲(chǔ)存相加的值,假設(shè)分母為y分子為x,那么下一項(xiàng)的分母就等于x,下一項(xiàng)的分子就等于x+y,但是大家在寫代碼的時(shí)候要注意一點(diǎn)的是我們要先賦值分母再來賦值分子,大家可以自行思考一下為什么,那么我們一開始將x初始化為2,將y初始化為1 ,再通過循環(huán)來實(shí)現(xiàn)累加sum=sum+x/y,因?yàn)槲覀冞@里要得到小數(shù)所以我們?cè)趚的前面乘以1.0,用來得到小數(shù)那我們的代碼實(shí)現(xiàn)如下:
第十題解析
第十題:
這里我們來看一下這個(gè)題怎么來做哈,這里我們講兩個(gè)方法:
第一種:
首先我們可以得到這是一個(gè)數(shù)組,我們要在一個(gè)數(shù)組里面找到一個(gè)數(shù)字n,那么首先我們要知曉的一件事情就是我們這個(gè)數(shù)字很可能是找不到的,我們這里就得分兩種情況一個(gè)是找的到,另一個(gè)就是找不到,因?yàn)檫@里是一個(gè)數(shù)組,數(shù)組里面裝的數(shù)肯定是有限的,那么我們這里就可以用循環(huán)來一個(gè)一個(gè)的找,我每一個(gè)數(shù)組的元素都對(duì)比一下,是不是就可以找到了,那么我們這里假設(shè)一個(gè)數(shù)組有十個(gè)元素,數(shù)組的元素為1 2 3 4 5 6 7 8 9 10我們要找7這個(gè)元素,如果找到的話我們就返回這個(gè)元素的下標(biāo),那么我們這里通過循環(huán)用一個(gè)一個(gè)比較的方法來實(shí)現(xiàn)這個(gè)功能代碼如下:
第二種方法:
其實(shí)大家可以發(fā)現(xiàn)我們上面的方法在做題的時(shí)候其實(shí)效率是非常的低的,因?yàn)槲乙獜念^開始尋找,如果我們要找的那個(gè)數(shù)在末尾的話,那么我們這個(gè)方法就非常的吃虧,如果這個(gè)數(shù)組的數(shù)據(jù)還非常的多的話,那么我們這個(gè)查找的效率其實(shí)是非常的低的,那么這里大家在讀題的時(shí)候是否發(fā)現(xiàn)了這個(gè)點(diǎn)沒?我們的數(shù)組其實(shí)是一個(gè)有序的數(shù)組,也就是說我們的數(shù)組里面的元素其實(shí)是按由小到大的規(guī)律遞增的,那么我們是不是就可以使用這個(gè)規(guī)律呢?好這里我們先創(chuàng)建三個(gè)變量一個(gè)是left表示最左邊的數(shù),一個(gè)是最右邊的數(shù)表示right,一個(gè)是mid表示中間的數(shù),那么我們這個(gè)mid就等于(left+right)/2,然后我們假設(shè)我們要找的數(shù)大小為k,那么這里我們就用下標(biāo)為mid所對(duì)應(yīng)的數(shù)來和k進(jìn)行比較,如果k大于下標(biāo)為mid所對(duì)應(yīng)的數(shù),那么這里我們就可以知道k的值所對(duì)應(yīng)的下標(biāo)其實(shí)是在mid和right之間,那么我們這里就要縮小范圍我們就將left等于mid+1,那么我們這里的mid就等于新的(right+left)/2,然后繼續(xù)進(jìn)行比較,那么如果k的值小于下標(biāo)為mid所對(duì)應(yīng)的數(shù)呢?那么我們這里就將right等于mid-1;來縮小范圍然后繼續(xù)用新的mid來繼續(xù)進(jìn)行判斷,那么這里大家其實(shí)可以看的出來這里是一個(gè)循環(huán),那么既然是循環(huán)的話,我們就得要有讓循環(huán)停止下來的條件,這里我們可以將條件分為兩種:第一種就是找到了,那么這個(gè)條件就非常好的得出來,我們可以使用if語句如果arr[mid]=k我們就可以通過break語句來跳出循環(huán),另外一個(gè)循環(huán)終止的條件就是當(dāng)我們這樣不停的求出mid再將mid-1的值賦給right或mid的時(shí)候我們肯定會(huì)出現(xiàn)一種情況就是left的值大于right出現(xiàn)這樣的情況就表明這個(gè)數(shù)在我們的數(shù)組里面是不存在的,我們來看個(gè)例子假設(shè)數(shù)組的元素為0 1 2 3 4 5 6 8 9 10,我們要找7這個(gè)數(shù)所對(duì)應(yīng)的下標(biāo),那么我們這里一開始left的值等于0 ,right等于9,所以根據(jù)計(jì)算我們這里的mid就等于了4,下標(biāo)4所對(duì)應(yīng)的數(shù)組的元素就為4,4的值是小于7的,那么我們這里就將left的值賦值為4+1=5,所以這里我們?cè)儆?jì)算以下mid的值就等于(5+9)/2=6,而下標(biāo)為6所對(duì)應(yīng)的值為6,而6還是小于7,所以left就等于6+1=7,mid就等于(7+9)/2=8,下標(biāo)為8對(duì)應(yīng)的值為9,這時(shí)9是大于7的,所及我們就將right的值改為8-1=7,而mid就等于(7+7)/2=7,但是下標(biāo)7所對(duì)應(yīng)的值為8,還是大于7,所以right就等于7-1=6,好這時(shí)候就出現(xiàn)了right小于left的情況就說明了這里是找不到該值的下標(biāo)的,那么希望大家能夠理解這個(gè)方法我們的代碼實(shí)現(xiàn)如下:
其實(shí)看到這里我們上面有個(gè)地方可能會(huì)出現(xiàn)錯(cuò)誤不知道大家發(fā)現(xiàn)沒,我們的mid=(left+right)/2,但是這里的相加之和的值超出了int的范圍的話,是不是就會(huì)出現(xiàn)問題呢?我們?cè)诔?的話得到的結(jié)果視乎就不一樣了吧,那么我們這里就可以將他改一下改成(left+(right-left)/2)就不會(huì)出現(xiàn)這樣的情況我們將right相較于left多出來的一部分切一半再加到left的頭上是不是就不會(huì)產(chǎn)生超出范圍的情況了,這里大家好好體會(huì)一下。那么本篇文章就結(jié)束了大家好好體會(huì)一下,這里為了大家更好的學(xué)習(xí)本篇文章的所有代碼點(diǎn)擊下面鏈接可以查看:
點(diǎn)擊此處查看
總結(jié)
以上是生活随笔為你收集整理的c语言习题---(循环语句)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [MindManager]“R6025
- 下一篇: Golang基于学习总结