C語言100道經(jīng)典、實(shí)用、趣味程序設(shè)計(jì)編程百例精解_第1頁
C語言100道經(jīng)典、實(shí)用、趣味程序設(shè)計(jì)編程百例精解_第2頁
C語言100道經(jīng)典、實(shí)用、趣味程序設(shè)計(jì)編程百例精解_第3頁
C語言100道經(jīng)典、實(shí)用、趣味程序設(shè)計(jì)編程百例精解_第4頁
已閱讀5頁,還剩135頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

摘要在屏幕上用“*”顯示0~360度的余弦函數(shù)cos(x)曲線。關(guān)鍵在于余弦曲線在0~360度的區(qū)間內(nèi),一行中要顯示兩個(gè)點(diǎn),而對一般的顯示器來說,只能按行輸出,即:輸出第一行信息后,只能向下一行輸出,不能再返回到上一行。在屏幕上用“ボ’顯示。~360度的余弦函數(shù)cos(x)曲線?問題分析與算法設(shè)計(jì)如果在程序中使用數(shù)組,這個(gè)問題十分簡單。但若規(guī)定不能使用數(shù)組,問題就變得不容易了。關(guān)鍵在于余弦曲線在O、360度的區(qū)間內(nèi),一行中要顯示兩個(gè)點(diǎn),而對一般的顯示器來說,只能按行輸出,即:輸出第一行信息后,只能向下一行輸出,不能再返回到上一行。為了獲得本文要求的圖形就必須在一行中一次輸出兩個(gè)“ボ‘。為了同時(shí)得到余弦函數(shù)cos(x)圖形在一行上的兩個(gè)點(diǎn),考慮利用cos(x)的左右對稱性。將屏幕的行方向定義為x,列方向定義為y,則〇、180度的圖形與180、360度的圖形是左右對稱的,若定義圖形的總寬度為62歹リ,計(jì)算出x行0180度時(shí)y點(diǎn)的坐標(biāo)m,那么在同一行與之對稱的180~360度的y點(diǎn)的坐標(biāo)就應(yīng)為62-m?程序中利用反余弦函數(shù)acos計(jì)算坐標(biāo)(x,y)的對應(yīng)關(guān)系。使用這種方法編出的程序短小精煉,體現(xiàn)了一定的技巧。?程序說明與注釋#include<stdio.h>#include<math.h>intmain()(doubley;intx,m;for(y=l;y>=-l;y-=0.1)/*y為列方向,值從1到T,步長為0.1*/(m=acos(y)*10;/*計(jì)算出y對應(yīng)的弧度m,乘以10為圖形放大倍數(shù)?/for(x=l;x<m;x++)printf(*");printfぐ*");/?控制打印左側(cè)的?號?/for(;x<62-m;x++)printf("");printf('*\n");/?控制打印同一行中對稱的右側(cè)?號?/2.繪制余弦曲線和直線摘要在屏幕上顯示0~360度的cos(x)曲線與直線f(x)=45*(y-l)+31的迭加圖形。其中cos(x)圖形用“*”表示,f(x)用“+”表示,在兩個(gè)圖形相交的點(diǎn)上則用f(x)圖形的符號。圖形迭加的關(guān)鍵是要在分別計(jì)算出同一行中兩個(gè)圖形的列方向點(diǎn)坐標(biāo)后,正確判斷相互的位置關(guān)系。在屏幕上顯示〇、360度的cos(x)曲線與直線f(x)=45*(y-1)+31的迭加圖形。其中cos(x)圖形用“*”表示,f(x)用“+”表示,在兩個(gè)圖形相交的點(diǎn)上則用f(x)圖形的符號。?問題分析與算法設(shè)計(jì)本題可以在上題的基礎(chǔ)上進(jìn)行修改。圖形迭加的關(guān)鍵是要在分別計(jì)算出同一行中兩個(gè)圖形的列方向點(diǎn)坐標(biāo)后,正確判斷相互的位置關(guān)系。為此,可以先判斷圖形的交點(diǎn),再分別控制打印兩個(gè)不同的圖形。?程序注釋與說明#include<stdio.h>#include<math.h>intmain(){doubley;intx,m,n,yy;for(yy=0;yy<=20;yy++)/?對于第一個(gè)y坐標(biāo)進(jìn)行計(jì)算并在一行中打印圖形?/{y=0.l*yy;/*y:屏幕行方向坐標(biāo)?/m=acos(l-y)*10;/*m:cos(x)曲線上y點(diǎn)對應(yīng)的屏幕列坐標(biāo)?/n=45*(y-1)+31;/*n:直線上y點(diǎn)對應(yīng)的列坐標(biāo)?/for(x=0;x<=62;x++)/*x:屏幕列方向坐標(biāo)?/if(x==m&&x==n)printf("+");/?直線與cos(x)相交時(shí)打印*/elseif(x=n)printf("+”);/?打印不相交時(shí)的直線圖形*/elseif(x=m||x==62-m)printf("*");/?打印不相交時(shí)的cos(x)圖形?/elseprintf("つ;/?其它情況打印空格*/printf('\n");摘要在屏幕上用“*”畫一個(gè)空心的圓?問題分析與算法設(shè)計(jì):打印圓可利用圖形的左右對稱性。根據(jù)圓的方程:R*R=X*X+Y*Y可以算出圓上每一點(diǎn)行和列的對應(yīng)關(guān)系。?思考題:實(shí)現(xiàn)函數(shù)y=x2的圖形與圓的圖形疊加顯示在屏幕上用“ボ’畫一個(gè)空心的圓?問題分析與算法設(shè)計(jì)打印圓可利用圖形的左右對稱性。根據(jù)圓的方程:R*R=X*X+Y*Y可以算出圓上每一點(diǎn)行和列的對應(yīng)關(guān)系。?程序說明與注釋#include<stdio.h>#include<math.h>intmain(){doubley;intx,m;for(y=10;y>=-10;y-)(m=2.5*sqrt(100-y*y);/*計(jì)算行y對應(yīng)的列坐標(biāo)m,2.5是屏幕縱橫比調(diào)節(jié)系數(shù)因?yàn)槠聊坏男芯啻笥诹芯?不進(jìn)行調(diào)節(jié)顯示出來的將是橢圓?/for(x=l;x<30-m;x++)printf(?つ;/?圖形左側(cè)空白控制?/printfぐ*");/*圓的左側(cè)?/for(;x<30+m;x++)printf("つ;/?圖形的空心部分控制?/printf("林nつ;/?圓的右側(cè)?/return0;4.歌星大獎(jiǎng)賽在歌星大獎(jiǎng)賽中,有10個(gè)評委為參賽的選手打分,分?jǐn)?shù)為廣100分。選手最后得分為:去掉ー個(gè)最高分和一個(gè)最低分后其余8個(gè)分?jǐn)?shù)的平均值。請編寫ー個(gè)程序?qū)崿F(xiàn)。題目條件不變,但考慮同時(shí)對評委評分進(jìn)行裁判,即在10個(gè)評委中找出最公平和最不公平…在歌星大獎(jiǎng)賽中,有10個(gè)評委為參賽的選手打分,分?jǐn)?shù)為廣100分。選手最后得分為:去掉ー個(gè)最高分和一個(gè)最低分后其余8個(gè)分?jǐn)?shù)的平均值。請編寫ー個(gè)程序?qū)崿F(xiàn)。?問題分析與算法設(shè)計(jì)這個(gè)問題的算法十分簡單,但是要注意在程序中判斷最大、最小值的變量是如何賦值的。?程序說明與注釋#include<stdio.h>intmain()(intinteger,i,max,min,sum;max二一32768;/?先假設(shè)當(dāng)前的最大值max為C語言整型數(shù)的最小值?/min=32767;/?先假設(shè)當(dāng)前的最小值min為C語言整型數(shù)的最大值?/sum=0;/運(yùn)行結(jié)果Inputnumberl=90Inputnumber2=91Inputnumber3=93Inputnumber4=94Inputnumber5=90Inputnumber6=99Inputnumber7=97Inputnumber8=92Inputnumber9=91運(yùn)行結(jié)果Inputnumberl=90Inputnumber2=91Inputnumber3=93Inputnumber4=94Inputnumber5=90Inputnumber6=99Inputnumber7=97Inputnumber8=92Inputnumber9=91Inputnumber10=95Canceledmaxscore:99Canceledminscore:90Averagescore:92for(i=l;i<=10;i++){printfC*Inputnumber%d=",i);scanf("%d",&integer);/*輸入評委的評分?/sum+=integer;/*計(jì)算總分?/if(integer>max)max=integer;/?通過比較篩選出其中的最高分?/if(integer<min)min=integer;/?通過比較篩選出其中的最低分?/}printf("Canceledmaxscore:%d\nCance1edminscore:%d\nz/,max,min);printf("Averagescore:%d\n",(sum-max-min)/8);/?輸出結(jié)果?/}5,求最大數(shù)摘要問555555的約數(shù)中最大的三位數(shù)是多少?根據(jù)約數(shù)的定義,對于ー個(gè)整數(shù)N,除去1和它自身外,凡能整除N的數(shù)即為N的約數(shù)。因此,最簡單的方法是用2到N-1之間的所有數(shù)去除N,即可求出N的全部約數(shù)。本題只要求取約數(shù)中最大的三位數(shù),則其取值范圍可限制在!00到999之間。問555555的約數(shù)中最大的三位數(shù)是多少??問題分析與算法設(shè)計(jì)根據(jù)約數(shù)的定義,對于一個(gè)整數(shù)N,除去1和它自身外,凡能整除N的數(shù)即為N的約數(shù)。因此,最簡單的方法是用2到N-1之間的所有數(shù)去除N,即可求出N的全部約數(shù)。本題只要求取約數(shù)中最大的三位數(shù),則其取值范圍可限制在!00到999之間。?程序說明與注釋#include<stdio.h>intmain(){longi;intj;printf('Pleaseinputnumber:z/);scanf("%ld",&i);for(j=999;j>=100;j-)if(i%j==O){printflThemaxfactorwith3digitsin%ldis:%d,\n*,i,j);break;?運(yùn)行結(jié)果輸入:555555輸出:Themaxfactorwith3digitsin555555is:7776.高次方數(shù)的尾數(shù)摘要求13的13次方的最后三位數(shù)?解本題最直接的方法是:將13累乘13次方截取最后三位即可。但是由于計(jì)算機(jī)所能表示的整數(shù)范圍有限,用這種“正確”的算法不可能得到正確的結(jié)果。事實(shí)上,題目僅要求最后三位的值,完全沒有必要求13的13次方的完整結(jié)果。求13的13次方的最后三位數(shù)?問題分析與算法設(shè)計(jì)解本題最直接的方法是:將13累乘13次方截取最后三位即可。但是山于計(jì)算機(jī)所能表示的整數(shù)范圍有限,用這種“正確”的算法不可能得到正確的結(jié)果。事實(shí)上,題目僅要求最后三位的值,完全沒有必要求13的13次方的完整結(jié)果。研究乘法的規(guī)律發(fā)現(xiàn):乘積的最后三位的值只與乘數(shù)和被乘數(shù)的后三位有關(guān),與乘數(shù)和被乘數(shù)的高位無關(guān)。利用這一規(guī)律,可以大大簡化程序。?程序說明與注釋#include<stdio.h>intmain(){inti,x,y,last=1;/?變量last保存求X的Y次方過程中的部分乘積的后三位?/printf("InputXandY(XThelast3digitsof13**20is:801Y):");Thelast3digitsof13**20is:801scanf("%d**%d",&x,&y);for(i=l;i<=y;i++)/運(yùn)行結(jié)果InputXandY(X**Y):13**13Thelast3digitsof13**13is:253InputX運(yùn)行結(jié)果InputXandY(X**Y):13**13Thelast3digitsof13**13is:253InputXandY(X**Y):13**20last=last*x%1000;/?將last乘X后對1000取模,即求積的后三位?/printf("Thelast3digitsof%d**%dis:%d\n",x,y,last%1000);/?打印結(jié)果?/}7.階乘尾數(shù)零的個(gè)數(shù)摘要100!的尾數(shù)有多少個(gè)零?為了解決這個(gè)問題,必須首先從數(shù)學(xué)上分析在100!結(jié)果值的末尾產(chǎn)生零的條件。不難看出:ー個(gè)整數(shù)若含有一個(gè)因子5,則必然會(huì)在求100!時(shí)產(chǎn)生一個(gè)零。因此問題轉(zhuǎn)化為求1到100這!00個(gè)整數(shù)中包含了多少個(gè)因子5〇100!的尾數(shù)有多少個(gè)零?問題分析與算法設(shè)計(jì)可以設(shè)想:先求出100!的值,然后數(shù)一下末尾有多少個(gè)零。事實(shí)上,與上題ー樣,由于計(jì)算機(jī)所能表示的整數(shù)范圍有限,這是不可能的。為了解決這個(gè)問題,必須首先從數(shù)學(xué)上分析在100!結(jié)果值的末尾產(chǎn)生零的條件。不難看出:ー個(gè)整數(shù)若含有一個(gè)因子5,則必然會(huì)在求100!時(shí)產(chǎn)生一個(gè)零。因此問題轉(zhuǎn)化為求1到100這100個(gè)整數(shù)中包含了多少個(gè)因子5。若整數(shù)N能被25整除,則N包含2個(gè)因子5;若整數(shù)N能被5整除,則N包含1個(gè)因子5。程序說明與注釋#include<stdio.h>intmain(){inta,countニ〇;for(a=5;a〈=100;a+=5)〃循環(huán)從5開始,以5的倍數(shù)為步長,考察整數(shù)(++count;//若為5的倍數(shù),計(jì)數(shù)器加1if(!(a%25))++count;〃若為25的倍數(shù),計(jì)數(shù)器再加1)printf("Thenumberof0intheendof100!is:%d.\n",count)!〃打印結(jié)果return0;)運(yùn)行結(jié)果Thenumberof0intheendof100!is:24.問題進(jìn)ー步討論本題的求解程序是正確的,但是存在明顯的缺點(diǎn)。程序中判斷整數(shù)N包含多少個(gè)因子5的方法是與程序中的100有關(guān)的,若題目中的100改為1000,則就要修改程序中求因子5的數(shù)目的算法了。8.借書方案知多少摘要小明有五本新書,要借給A,B,C三位小朋友,若每人每次只能借一本,則可以有多少種不同的借法?本問題實(shí)際上是ー個(gè)排列問題,即求從5個(gè)中取3個(gè)進(jìn)行排列的方法的總數(shù)。首先對五本書從1至5進(jìn)行編號,然后使用窮舉的方法。小明有五本新書,要借給A,B,C三位小朋友,若每人每次只能借一本,則可以有多少種不同的借法??問題分析與算法設(shè)計(jì)本問題實(shí)際上是ー個(gè)排列問題,即求從5個(gè)中取3個(gè)進(jìn)行排列的方法的總數(shù)。首先對五本書從1至5進(jìn)行編號,然后使用窮舉的方法。假設(shè)三個(gè)人分別借這五本書中的一本,當(dāng)三個(gè)人所借的書的編號都不相同時(shí),就是滿足題意的ー種借閱方法。?程序說明與注釋intmain(){inta,b,c,count=0;printf('TherearediffrentmethodsforXMtodistributebooksto3readers:\nz/);for(a=l;a<=5;a++)/?窮舉第一個(gè)人借5本書中的1本的全部情況?/for(b=l;b<=5;b++)/?窮舉第二個(gè)人借5本書中的一本的全部情況?/for(c=1;a!=b&&c<=5;c++)/?當(dāng)前兩個(gè)人借不同的書時(shí),窮舉第三個(gè)人借5本書中的1本的全部情況?/if(c!=a&&c!=b)/運(yùn)行結(jié)果TherearediffrentmethodsforXMtodistributebooksto3readers:1:1,2,32:1,2,43:1,2,54:1,3,25:1,3,46:1,3,57:1,4,28:1,4,39:1,4,510:1,5,211:1,5,312:1,5,413:2,1,314:2,1,415:2,1,516:2,3,117:2,3,418:2,3,519:2,4,120:2,4,321:2,4,522:2,5,123:2,5,324:2,5,425:3,1,226:3,1,427:3,1,528:3,2,129:3,2,430:3,2,531:3,4,132:3,4,233:3,4,534:3,5,135:3,5,236:3,5,437:4,1,238:4,1,339:4,1,540:4,2,141:4,2,342:4,2,543:4,3,144:4,3,245:4,3,546:4,5,147:4,5,248:4,5,349:5,1,250:5,1,351:5,1,452:5,2,153:5,2,354:5,2,455:5,3,156:5,3,257:5,3,458:5,4,159:5,4,260:5,4,3判斷第三人與運(yùn)行結(jié)果TherearediffrentmethodsforXMtodistributebooksto3readers:1:1,2,32:1,2,43:1,2,54:1,3,25:1,3,46:1,3,57:1,4,28:1,4,39:1,4,510:1,5,211:1,5,312:1,5,413:2,1,314:2,1,415:2,1,516:2,3,117:2,3,418:2,3,519:2,4,120:2,4,321:2,4,522:2,5,123:2,5,324:2,5,425:3,1,226:3,1,427:3,1,528:3,2,129:3,2,430:3,2,531:3,4,132:3,4,233:3,4,534:3,5,135:3,5,236:3,5,437:4,1,238:4,1,339:4,1,540:4,2,141:4,2,342:4,2,543:4,3,144:4,3,245:4,3,546:4,5,147:4,5,248:4,5,349:5,1,250:5,1,351:5,1,452:5,2,153:5,2,354:5,2,455:5,3,156:5,3,257:5,3,458:5,4,159:5,4,260:5,4,3printf(count%8?z,%2d:%d,%d,%d":"%2d:%d,%d,%d\n,z,++count,a,b,c);/?打印可能的借閱方法?/9.楊輝三角形摘要在屏幕上顯示楊輝三角形。楊輝三角形中的數(shù),正是(x+y)的N次方暮展開式各項(xiàng)的系數(shù)。本題作為程序設(shè)計(jì)中具有代表性的題目,求解的方法很多,這里僅給出ー種。讀者可自行設(shè)計(jì)ー種實(shí)現(xiàn)楊輝三角形的方法。在屏幕上顯示楊輝三角形11112113311464115101051?問題分析與算法設(shè)計(jì)楊輝三角形中的數(shù),正是(x+y)的N次方幕展開式各項(xiàng)的系數(shù)。本題作為程序設(shè)計(jì)中具有代表性的題目,求解的方法很多,這里僅給出ー種。從楊輝三角形的特點(diǎn)出發(fā),可以總結(jié)出:1)第N行有N+!個(gè)值(設(shè)起始行為第〇行)2)對于第N行的第J個(gè)值:(N>=2)當(dāng)J=1或アN+1時(shí):其值為1J!=l且J!=N+1時(shí):其值為第N-1行的第J-1個(gè)值與第N-1行第J個(gè)值之和將這些特點(diǎn)提煉成數(shù)學(xué)公式可表示為:1x=l或x=N+lc(x,y)=c(xT,yT)+c(xT,y)其它本程序應(yīng)是根據(jù)以上遞歸的數(shù)學(xué)表達(dá)式編制的。?程序說明與注釋#include<stdio.h>intmain(){inti,j,n=13;printf("N=”);while(n>12)scanf("%d〃,&n);/*控制輸入正確的值以保證屏幕顯示的圖形正確?/for(i=0;i<=n;i++)/*控制輸出N行?/|for(j-0;j<24-2*i;j++)printfCつ;/?控制輸出第i行前面的空格?/for(j=l;j<i+2;j++)printf("%4d”,c(i,j));/?輸出第i行的第j個(gè)值?/voidintc(intx,inty)/?求楊輝三角形中第x行第y列的值?/(intz;if((y==l)II(y=x+l))return1;/?若為x行的第1或第x+1列,則輸出1運(yùn)行結(jié)果count=2999/z=c(xT,yT)+c(xT,y);/?否則,其值為前一行中第y-1列與第y列值之和?/運(yùn)行結(jié)果count=2999)18.有限5位數(shù)摘要個(gè)位數(shù)為6且能被3整除的五位數(shù)共有多少?根據(jù)題意可知,滿足條件的五位數(shù)的選擇范圍是!0006.10016.?〇99996。可設(shè)基礎(chǔ)數(shù)i=1000,通過計(jì)算i*10+6即可得到欲選的數(shù)(i的變化范圍是100〇?999),再判斷該數(shù)能否被3整除。個(gè)位數(shù)為6且能被3整除的五位數(shù)共有多少??題目分析與算法設(shè)計(jì)根據(jù)題意可知,滿足條件的五位數(shù)的選擇范圍是10006、10016。。。99996??稍O(shè)基礎(chǔ)數(shù)i=1000,通過計(jì)算i*10+6即可得到欲選的數(shù)(i的變化范圍是1000~999),再判斷該數(shù)能否被3整除。?程序說明與注釋#include<stdio.h>intmain()(longinti;intcount=0;/*count:統(tǒng)計(jì)滿足條件的五位數(shù)的個(gè)數(shù)?/for(i=1000;i<9999;i++)if(!((i*10+6)%3))/?判斷所選的數(shù)能否被3整除?/count++;/*若滿足條件則計(jì)數(shù)?/printflcount=%d\n,count);10.數(shù)制轉(zhuǎn)換摘要將十進(jìn)制整數(shù)轉(zhuǎn)換為二進(jìn)制的方法很多,這里介紹的實(shí)現(xiàn)方法利用了C語言能夠?qū)ξ贿M(jìn)行操作的特點(diǎn)。對于C語言來說,ー個(gè)整數(shù)在計(jì)算機(jī)內(nèi)就是以二進(jìn)制的形式存儲(chǔ)的,所以沒有必要再將一個(gè)整數(shù)經(jīng)過ー系列的運(yùn)算轉(zhuǎn)換為二進(jìn)制形式,只要將整數(shù)在內(nèi)存中的二進(jìn)制表示輸出即可。將任一整數(shù)轉(zhuǎn)換為二進(jìn)制形式?問題分析與算法設(shè)計(jì)將卜進(jìn)制整數(shù)轉(zhuǎn)換為二進(jìn)制的方法很多,這里介紹的實(shí)現(xiàn)方法利用了c語言能夠?qū)ξ贿M(jìn)行操作的特點(diǎn)。對于C語言來說,ー個(gè)整數(shù)在計(jì)算機(jī)內(nèi)就是以二進(jìn)制的形式存儲(chǔ)的,所以沒有必要再將一個(gè)整數(shù)經(jīng)過ー系列的運(yùn)算轉(zhuǎn)換為二進(jìn)制形式,只要將整數(shù)在內(nèi)存中的二進(jìn)制表示輸出即可。?程序說明與注釋#include<stdio.h>voidprintb(int,int);intmain(){intx;printf("Inputnumber:");scanf("%d",&x);printf("numberofdecimalform:%d\n",x);printflitsbinaryform:");printb(x,sizeof(int)運(yùn)行結(jié)果輸入:8輸出:numberofdecimalform:運(yùn)行結(jié)果輸入:8輸出:numberofdecimalform:8it'sbunaryform:0000000000001000輸入:-8sizeof(int)*8:int型對應(yīng)的位數(shù)?/putchar('\n);)voidprintb(intx,intn)(if(n>0)(putchar(*0*+((unsigned)(x&(l?(n-l)))?(n-l)));/?輸出第n位?/printb(x,n-l);/?歸調(diào)用,輸出x的后nT位?/輸出:numberofdecimalform:-8it'sbinaryform:1111111111111000輸入:32767輸出:numberofdecimalform:32767it'sbinaryform:0111111111111111輸入:-32768輸出:numberofdecimalform:-32768it'sbinaryform:1000000000000000輸入:128輸出:numberofdecimalform:128it'sbinaryform:000000001000000011.打魚還是曬網(wǎng)摘要中國有句俗語叫“三天打魚兩天曬網(wǎng)”。某人從1990年1月1日起開始“三天打魚兩天曬網(wǎng)”,問這個(gè)人在以后的某ー天中是“打魚”還是“曬網(wǎng)”。根據(jù)題意可以將解題過程分為三步:1)計(jì)算從1990年1月1日開始至指定日期共有多少天……中國有句俗語叫“三天打魚兩天曬網(wǎng)”。某人從1990年1月1日起開始“三天打魚兩天曬網(wǎng)”,問這個(gè)人在以后的某ー天中是“打魚”還是“曬網(wǎng)”。?問題分析與算法設(shè)計(jì)根據(jù)題意可以將解題過程分為三步:1)計(jì)算從1990年1月1日開始至指定日期共有多少天;2)由于“打魚”和“曬網(wǎng)”的周期為5天,所以將計(jì)算出的天數(shù)用5去除;3)根據(jù)余數(shù)判斷他是在“打魚”還是在“曬網(wǎng)”;若余數(shù)為1,2,3,則他是在“打魚”否則是在“曬網(wǎng)”在這三步中,關(guān)鍵是第一步。求從1990年1月1日至指定日期有多少天,要判斷經(jīng)歷年份中是否有閏年,二月為29天,平年為28天。閏年的方法可以用偽語句描述如下:如果((年能被4除盡且不能被100除盡)或能被400除盡)則該年是閏年;否則不是閏年。C語言中判斷能否整除可以使用求余運(yùn)算(即求模)?程序說明與注釋#include<stdio.h>intdays(structdateday);structdate{intyear;intmonth;intday;);intmain(){structdatetoday,term;intyearday,year,day;printftEnteryear/month/day:z,);scanf(線d%d%d”,fetoday.year,&today.month,&today.day);/*輸入日期*/term.month=12;/?設(shè)置變量的初始值:月?/term.day=31;/*設(shè)置變量的初始值:日?/for(yearday=0,year=1990;year<today.year;year++)term.year=year;yearday+=days(term);/?計(jì)算從1990年至指定年的前一年共有多少天?/}yearday+=days(today);/?加上指定年中到指定日期的天數(shù)?/day=yearday%5;/?求余數(shù)?/if(day>0&&day<4)printf(運(yùn)行結(jié)果Enteryear/month/day:19911025Hewasfishingatday.Enteryear/month/day:19921025Hewassleepingatday.Enteryear/month/day:1993運(yùn)行結(jié)果Enteryear/month/day:19911025Hewasfishingatday.Enteryear/month/day:19921025Hewassleepingatday.Enteryear/month/day:19931025Hewassleepingatday.}intdays(structdateday){staticintdaytab[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31,},/?平均每月的天數(shù)?/{0,31,29,31,30,31,30,31,31,30,31,30,31,},);inti,Ip;lp=day.year%4==0&&day.year%100!=0||day.year%400==0;/?判定year為閏年還是平年,lp=0為平年,非〇為閏年?/for(i=l;i<day.month;i++)/?計(jì)算本年中自1月1日起的天數(shù)?/day.day+=day_tab[Ip][i];returnday.day;}12.抓交通肇事犯摘要ー輛卡車違反交通規(guī)則,撞人后逃跑。現(xiàn)場有三人目擊事件,但都沒有記住車號,只記下車號的ー些特征。甲說:牌照的前兩位數(shù)字是相同的;乙說:牌照的后兩位數(shù)字是相同的,但與前兩位不同;丙是數(shù)學(xué)家,他說:四位的車號剛好是ー個(gè)整數(shù)的平方。請根據(jù)以上線索求出車號。ー輛卡車違反交通規(guī)則,撞人后逃跑?,F(xiàn)場有三人目擊事件,但都沒有記住車號,只記下車號的ー些特征。甲說:牌照的前兩位數(shù)字是相同的;乙說:牌照的后兩位數(shù)字是相同的,但與前兩位不同;丙是數(shù)學(xué)家,他說:四位的車號剛好是ー個(gè)整數(shù)的平方。請根據(jù)以上線索求出車號。問題分析與算法設(shè)計(jì)按照題ロ的要求造出ー個(gè)前兩位數(shù)相同、后兩位數(shù)相同且相互間又不同的整數(shù),然后判斷該整數(shù)是否是另ー個(gè)整數(shù)的平方。程序說明與注釋#include<stdio.h>includeくmath.h>intmain()(inti,j,k,c;for(i=l;i<=9;i++)/運(yùn)行結(jié)果Lorry_No.is7744i:車號前二位的取值運(yùn)行結(jié)果Lorry_No.is7744for(j=0;jく=9;j++)/*j:車號后二位的取值?/if(i!=j)/*判斷二位數(shù)字是否相異?/k=i*1000+i*100+j*10+j;/*計(jì)算出可能的整數(shù)?/for(c=31;c*cくk;c++);/?判斷該數(shù)是否為另一整數(shù)的平方?/if(c*c==k)printf(*Lorry-No.is%d.\nzz,k);/?若是,打印結(jié)果?/13.該存多少錢摘要假設(shè)銀行一年整存零取的月息為0.63%?,F(xiàn)在某人手中有一筆錢,打算在今后的五年中的年底取出1000元,到第五年時(shí)剛好取完,請算出他存錢時(shí)應(yīng)存入多少。分析存錢和取錢的過程,可采用倒推的方法。若第五年年底連本帶息要取1000元,則要先求出第五年年初銀行存款的錢數(shù)假設(shè)銀行一年整存零取的月息為0.63機(jī)現(xiàn)在某人手中有一筆錢,他打算在今后的五年中的年底取出1000元,到第五年時(shí)剛好取完,請算出他存錢時(shí)應(yīng)存入多少。?問題分析與算法設(shè)計(jì)分析存錢和取錢的過程,可以采用倒推的方法。若第五年年底連本帶息要取1000元,則要先求出第五年年初銀行存款的錢數(shù):第五年初存款=1000/(1+12運(yùn)行結(jié)果Hemustsave4039.44atfirst0.運(yùn)行結(jié)果Hemustsave4039.44atfirst依次類推可以求出第四年、第三年 的年初銀行存款的錢數(shù):第四年年初存款=(第五年年初存款+1000)/(1+12*0.0063)第三年年初存款=(第四年年初存款+1000)/(1+12*0.0063)第二年年初存款=(第三年年初存款+1000)/(1+12*0.0063)第一年年初存款=(第二年年初存款+1000)/(1+12*0.0063)通過以上過程就可以很容易地求出第一年年初要存入多少錢。?程序說明與注釋#include<stdio.h>intmain()(inti;floattotalニ〇;for(i=0;i<5;i++)/*i為年數(shù),取值為〇~4年?/total=(total+1000)/(l+0.0063*12);/?累計(jì)算出年初存款數(shù)額,第五次的計(jì)算結(jié)果即為題解?/printf("Hemustsave%.2fatfirst.\n",total);14.怎樣存錢利最大摘要某人手中有2000元錢,通過計(jì)算選擇ー種存錢方案,使得錢存入銀行20年后得到的利息最多(假定銀行對超過存款期限的那一部分時(shí)間不付利息)。為了得到最多的利息,存入銀行的錢應(yīng)在到期時(shí)馬上取出來,然后立刻將原來的本金和利息加起來再作為新的本金存入銀行假設(shè)銀行整存整取存款不同期限的月息利率分別為:0.63%期限=1年0.66%期限=2年0.69%期限=3年0.75%期限=5年0.84%期限=8年利息=本金?月息利率?12?存款年限。現(xiàn)在某人手中有2000元錢,請通過計(jì)算選擇ー種存錢方案,使得錢存入銀行20年后得到的利息最多(假定銀行對超過存款期限的那一部分時(shí)間不付利息)。?問題分析與算法設(shè)計(jì)為了得到最多的利息,存入銀行的錢應(yīng)在到期時(shí)馬上取出來,然后立刻將原來的本金和利息加起來再作為新的本金存入銀行,這樣不斷地滾動(dòng)直到滿20年為止,由于存款的利率不同,所以不同的存款方法(年限)存20年得到的利息是不一樣的。分析題意,設(shè)2000元存20年,其中1年存il次,2年存i2次,3年存i3次,5年存i5次,8年存i8次,則到期時(shí)存款人應(yīng)得到的本利合計(jì)為:2000*(1+ratel)i1*(l+rate2)i2*(l+rate3)i3*(l+rate5)i5*(l+rate8)i8其中rateN為對應(yīng)存款年限的利率。根據(jù)題意還可得到以下限制條件:0<=i8<=20<=i5<=(20-8*i8)/50<=i3<=(20-8*i8-5*i5)/30<=i2<=(20-8*i8-5*i5-3*i3)/20<=il=20-8*i8-5*i5-3*i3-2*i2可以用窮舉法窮舉所有的i8、i5、i3、i2和il的組合,代入求本利的公式計(jì)算出最大值,就是最佳存款方案。?程序說明與注釋#include<stdio.h>#include<math.h>intmain()(inti8,i5,i3,i2,i1,n8,n5,n3,n2,nl;floatmax=0,term;for(i8=0;i8<3;i8++)/*窮舉所有可能的存款方式?/for(i5=0;i5く=(20-8*i8)/5;i5++)

for(i3=0;i3く=(20-8*i8-5*i5)/3;i3++)for(i2=0;i2<=(20-8*i8-5*i5-3*i3)/2;i2++)i1=20-8*i8-5*i5-3*i3-2*i2;term=2000.0*pow((double)(1+0.0063*12),(double)il)*pow((double)(1+2*0.0063*12),(double)i2)*pow((double)(1+3*0.0069*12),(double)i3)*pow((double)(1+5*0.0075*12),(double)i5)*pow((double)(1+8*0.0084*12),(double)i8);/?計(jì)算到期時(shí)的本利合計(jì)?/if(term>max)max=term;nl=i1;n2=i2;n3=i3;n5=i5;n8=i8;abank:\n");printfCmadeprintflmadeprintf(/zmadeprintt〈madeprintf<madeprintf(〃Toalfixeddepositfixeddepositfixeddepositfixeddepositfixeddeposit%.2f\n”,max)for8year:%dfor5year:%dfor3year:%dfor2year:%dfor1year:%dtimes'n”,n8);times'n,abank:\n");printfCmadeprintflmadeprintf(/zmadeprintt〈madeprintf<madeprintf(〃Toalfixeddepositfixeddepositfixeddepositfixeddepositfixeddeposit%.2f\n”,max)for8year:%dfor5year:%dfor3year:%dfor2year:%dfor1year:%dtimes'n”,n8);times'n,n5);times'n,n3);times'n,n2);times'n”,nl);/?輸出存款方式?/?運(yùn)行結(jié)果Formaxinumprofit,heshouldsosavehismoneyinabank:madefixeddepositmadefixeddepositmadefixeddepositmadefixeddepositmadefixeddepositTotal:8841.01for8year:Otimesfor5year:4timesfor3year:Otimesfor2year:Otimesfor1year:Otimes可見最佳的存款方案為連續(xù)四次存5年期。15.捕魚和分魚摘要A、B、C、D、E五個(gè)人在某天夜里合伙去捕魚,到第二天凌晨時(shí)都疲憊不堪,于是各自找地方睡覺。日上三桿,A第一個(gè)醒來,他將魚分為五份,把多余的一條魚扔掉,拿走自己的ー份。B第二個(gè)醒來,也將魚分為五份,把多余的一條魚扔掉,保持走自己的ー份。A、B、C、D、E五個(gè)人在某天夜里合伙去捕魚,到第二天凌晨時(shí)都疲憊不堪,于是各自找地方睡覺。日上三桿,A第一個(gè)醒來,他將魚分為五份,把多余的一條魚扔掉,拿走自己的ー份。B第二個(gè)醒來,也將魚分為五份,把多余的一條魚扔掉,保持走自己的一份。C、D、E依次醒來,也按同樣的方法拿走魚。問他們合伙至少捕了多少條魚??問題分析與算法設(shè)計(jì)根據(jù)題意,總計(jì)將所有的魚進(jìn)行了五次平均分配,每次分配時(shí)的策略是相同的,即扔掉一條魚后剩下的魚正好分成五份,然后拿走自己的一份,余下其它的四份。假定魚的總數(shù)為X,則X可以按照題目的要求進(jìn)行五次分配:XT后可被5整除,余下的魚為4運(yùn)行結(jié)果Totalnumberoffishcatched=3121(X-1)、5〇若X運(yùn)行結(jié)果Totalnumberoffishcatched=3121?程序說明與注釋#include<stdio.h>intmain()(intn,i,x,flag=l;/*flag!控制標(biāo)記?/for(n=6;flag;n++)/?采用試探的方法。令試探值n逐步加大?/|for(x=n,i=l&&flag;i<=5;i++)if((x-l)%5==0)x=4*(x-l)/5:elseflag=0;/?若不能分配則置標(biāo)記falg=0退出分配過程*/if(flag)break;/?若分配過程正常結(jié)束則找到結(jié)果退出試探的過程?/elseflag=l;/?否則繼續(xù)試探下一個(gè)數(shù)*/)printf("Totalnumberoffishcatched=%d\n",n);/?輸出結(jié)果?/16.出售金魚摘要買賣提將養(yǎng)的ー缸金魚分五次出售系統(tǒng)上一次賣出全部的一半加二分之一條;第二次賣出余下的三分之一加三分之一條;第三次賣出余下的四分之一加四分之一條;第四次賣出余下的五分之一加五分之一條;最后賣出余下的11條。問原來的魚缸中共有幾條金魚?買賣提將養(yǎng)的ー缸金魚分五次出售系統(tǒng)上一次賣出全部的一半加二分之一條;第二次賣出余下的三分之一加三分之一條;第三次賣出余下的四分之一加四分之一條:第四次賣出余下的五分之一ー加五分之一條;最后賣出余下的11條。問原來的魚缸中共有幾條金魚?問題分析與算法設(shè)計(jì)題目中所有的魚是分五次出售的,每次賣出的策略相同;第j次賣剩下的(j+i)分之一再加"(j+i)條。第五次將第四次余下的“條全賣了。假定第j次魚的總數(shù)為X,則第j次留下:X-(x+l)/(j+l)當(dāng)?shù)谒拇纬鍪弁戤厱r(shí),應(yīng)該剩下11條。若X滿足上述要求,則X就是題目的解。應(yīng)當(dāng)注意的是:"(x+l)/(j+l)”應(yīng)滿足整除條件。試探X的初值可以從23開始,試探的步長為2,因?yàn)閄的值一定為奇數(shù)。程序說明與注釋#include<stdio.h>intmain(){inti,j,n=O,x;/*n為標(biāo)志變量?/for(i=23;n==0;i+=2)/*控制試探的步長和過程?/(for(j=l,x=i;j<=4&&x>=ll;j++)/?完成出售四次的操作?/if((x+l)%(j+l)==O)/?若滿足整除條件則進(jìn)行實(shí)際的出售操作?/x-=(x+l)/(j+l);else{x=0;break;}/*否則停止計(jì)算過程?/if(j==5&&x==U)/?若第四次余下11條則滿足題意?/(printf("Thereare%dfishesatfirst.\n",i);/?輸出結(jié)果?/n=l;/*控制退出試探過程?/運(yùn)行結(jié)果Thereare59fishesatfirst.17.平分七筐魚摘要甲、乙、丙三位魚夫出海打魚,他們隨船帶了21只蘿筐。當(dāng)晚返航時(shí),他們發(fā)現(xiàn)有七筐裝滿了魚,還有七筐裝了半筐魚,另外七筐則是空的,由于他們沒有秤,只好通過目測認(rèn)為七個(gè)滿筐魚的重量是相等的,7個(gè)半筐魚的重量是相等的。在不將魚倒出來的前提下,怎樣將魚和筐平分甲、乙、丙三位魚夫出海打魚,他們隨船帶了21只夢筐。當(dāng)晚返航時(shí),他們發(fā)現(xiàn)有七筐裝滿了魚,還有七筐裝了半筐魚,另外七筐則是空的,由于他們沒有秤,只好通過目測認(rèn)為七個(gè)滿筐魚的重量是相等的,7個(gè)半筐魚的重量是相等的。在不將魚倒出來的前提下,怎樣將魚和筐平分為三份??問題分析與算法設(shè)計(jì)根據(jù)題意可以知道:每個(gè)人應(yīng)分得七個(gè)管筐,其中有3.5筐魚。采用ー個(gè)3*3的數(shù)組a來表示三個(gè)人分到的東西。其中每個(gè)人對應(yīng)數(shù)組a的一行,數(shù)組的第。列放分到的魚的整筐數(shù),數(shù)組的第1列放分到的半筐數(shù),數(shù)組的第2列放分到的空筐數(shù)。由題目可以推出:。數(shù)組的每行或每列的元素之和都為?;〇對數(shù)組的行來說,滿筐數(shù)加半筐數(shù)=3.5;?每個(gè)人所得的滿筐數(shù)不能超過3筐;?每個(gè)人都必須至少有1個(gè)半筐,且半筐數(shù)一定為奇數(shù)對于找到的某種分魚方案,三個(gè)人誰拿哪ー份都是相同的,為了避免出現(xiàn)重復(fù)的分配方案,可以規(guī)定:第二個(gè)人的滿筐數(shù)等于第一個(gè)人的滿筐數(shù);第二個(gè)人的半筐數(shù)大于等于第一個(gè)人的半筐數(shù)。?程序說明與注釋#include<stdio.h>inta[3][3],count;intmain()(inti,j,k,m,n,flag;printf(?,Itexistspossibledistribtionplans:\n");for(i=0;i〈=3;i++)/?試探第一個(gè)人滿筐a[〇][〇]的值,滿篋數(shù)不能>3*/(a[0][0]=i;for(j=i:j<=7-i&&j<=3:j++)/?試探第二個(gè)人滿筐a[l][0]的值,滿筐數(shù)不能>3*/(a[l][O]=j;if((a[2][0]=7->]て[0][。])>3)(:(?^打亜;/*第三個(gè)人滿筐數(shù)不能>3*/if(a[2][0]<a[l][0])break;/?要求后一個(gè)人分的滿筐數(shù)>=前一個(gè)人,以排除重復(fù)情況?/for(k=l;k<=5;k+=2)/?試探半筐a[0][1]的值,半筐數(shù)為奇數(shù)?/a[0][l]=k;for(m=l;m<7-k;m+=2)/?試探半筐a[l][l]的值,半筐數(shù)為奇數(shù)?/

a[l][l]=m;a[2][l]=7-k-m;for(flag=l,n=0;flag&&n<3;n++)/?判斷每個(gè)人分到的魚是3.5筐,flag為滿足題意的標(biāo)記變量?/if(a[n][0]+a[n][l]<7&&a[n][0]*2+a[n][1]=7)a[n][2]=7-a[n][0]-a[n][1];/*計(jì)算應(yīng)得到的空筐數(shù)量?/elseflag=0;/*不符合題意則置標(biāo)記為0?/if(flag)printf("No.%dFullbasketSemi--basketEmpty\n",++count);for(n=0;n<3;n++)printf("fisher%c:%d%d%d\n",'A'+n,a[n][0],a[n][1],a[n][2]);?運(yùn)行結(jié)果ItexistsNo.1FullfisherA:fisherB:fisherC:No.2FullfisherA:fisherB:fisherC:possibledistributionplans:basketSemi-basketEmpty1513133?運(yùn)行結(jié)果ItexistsNo.1FullfisherA:fisherB:fisherC:No.2FullfisherA:fisherB:fisherC:basketSemi-basketEmpty3232138除不盡的自然數(shù)摘要ー個(gè)自然數(shù)被8除余1,所得的商被8除也余1,再將第二次的商被8除后余7,最后得到ー個(gè)商為a?又知這個(gè)自然數(shù)被17除余4,所得的商被!7除余15,最后得到ー個(gè)商是a的2倍。求這個(gè)自然數(shù)。根據(jù)題意,可設(shè)最后的商為i(i從0開始取值),用逆推法可以列出關(guān)系式ー個(gè)自然數(shù)被8除余1,所得的商被8除也余1,再將第二次的商被8除后余7,最后得到ー個(gè)商為a。又知這個(gè)自然數(shù)被17除余4,所得的商被17除余15,最后得到ー個(gè)商是a的2倍。求這個(gè)自然數(shù)。?問題分析與算法設(shè)計(jì)根據(jù)題意,可設(shè)最后的商為i(i從0開始取值),用逆推法可以列出關(guān)系式:(((i*8+7)*8)+1)*8+1=((2*i*17)+15)*18+4再用試探法求出商i的值。?程序說明與注釋#include<stdio.h>intmain(){inti;for(i=0;;i++)/?試探商的值?/if(((i*8+7)*8+1)*8+1=(34*i+15)*17+4){/?逆推判斷所取得的當(dāng)前i值是否滿足關(guān)系式?//?若滿足則輸出結(jié)果?/printf(*Therequirednumberis:%d\n”,(34*i+15)*17+4);break;/?退出循環(huán)?/?運(yùn)行結(jié)果Therequirednumberis:1993一個(gè)奇異的三位數(shù)摘要ー個(gè)自然數(shù)的七進(jìn)制表達(dá)式是一個(gè)三位數(shù),而這個(gè)自然數(shù)的九進(jìn)制表示也是ー個(gè)三位數(shù),且這兩個(gè)三位數(shù)的數(shù)碼正好相反,求這個(gè)三位數(shù)。根據(jù)題意可知,七進(jìn)制和九進(jìn)制表示的這全自然數(shù)的每一位一定小于7,可設(shè)其七進(jìn)制數(shù)形式為kji,然后設(shè)其九進(jìn)制表示形式為ijkoー個(gè)自然數(shù)的七進(jìn)制表達(dá)式是一個(gè)三位數(shù),而這個(gè)自然數(shù)的九進(jìn)制表示也是ー個(gè)三位數(shù),且這兩個(gè)三位數(shù)的數(shù)碼正好相反,求這個(gè)三位數(shù)。?問題分析與算法設(shè)計(jì)根據(jù)題意可知,七進(jìn)制和九進(jìn)制表示的這全自然數(shù)的每一位一定小于7,可設(shè)其七進(jìn)制數(shù)形式為kji(i、j、k的取值分別為1?6),然后設(shè)其九進(jìn)制表示形式為ijk。?程序說明與注釋#include<stdio.h>intmain(){inti,j,k;for(i=l;i<7;i++)for(j=0;j<7;j++)for(k=l;k<7;k++)if(i運(yùn)行結(jié)果Thespecialnumberwith3digitsis:503(7)=305(9)=248(10)運(yùn)行結(jié)果Thespecialnumberwith3digitsis:503(7)=305(9)=248(10){printf('Thespecialnumberwith3digitsis:");printf(*%d%d%d(7)=%d%d%d(9)=%d(10)\n",k,j,i,i,j,k,i*9*9+j*9+k);})21.4位反序數(shù)摘要設(shè)N是ー個(gè)四位數(shù),它的9倍恰好是其反序數(shù),求N。反序數(shù)就是將整數(shù)的數(shù)字倒過來形成的整數(shù)??稍O(shè)整數(shù)N的千、百、十、個(gè)位為i、j、k、1,其取值均為0~9,則滿足關(guān)系式(i運(yùn)行結(jié)果Thenumbersatisfiedstatesconditionis:1089103+j*102+l〇?k+l)*9=(l*103+k*102+l〇?j+i)的式j(luò)、k、1即構(gòu)成運(yùn)行結(jié)果Thenumbersatisfiedstatesconditionis:1089設(shè)N是ー個(gè)四位數(shù),它的9倍恰好是其反序數(shù),求N。反序數(shù)就是將整數(shù)的數(shù)字倒過來形成的整數(shù)。例如:1234的反序數(shù)是4321。?問題分析與算法設(shè)計(jì)可設(shè)整數(shù)N的千、百、十、個(gè)位為i、j、k、1,其取值均為0~9,則滿足關(guān)系式:(i*103+j*102+10*k+l)*9=(l*103+k*102+10*j+i)的i、j、k、1即構(gòu)成N。?程序說明與注釋#include<stdio.h>intmainO(inti;for(i=1002;i<llll;i++)/?窮舉四位數(shù)可能的值?/if(i%10*1000+i/10%10*100+i/100%10*10+i/1000==i*9)/*判斷反序數(shù)是否是原整數(shù)的9倍?/printf("Thenumbersatisfiedstatsconditionis:%d\n”,i);/?若是則輸出?/22.求車速摘要ー輛以固定速度行駛的汽車,司機(jī)在上午io點(diǎn)看到里程表上的讀數(shù)是ー個(gè)對稱數(shù)(如果ー個(gè)數(shù)等于它的反序數(shù),則稱它為對稱數(shù)。即這個(gè)數(shù)從左向右讀和從右向左讀是完全ー樣的),為95859。兩小時(shí)后里程表上出現(xiàn)了一個(gè)新的對稱數(shù)。問該車的速度是多少?新對稱數(shù)是多少?ー輛以固定速度行駛的汽車,司機(jī)在上午10點(diǎn)看到里程表上的讀數(shù)是ー個(gè)對稱數(shù)(即這個(gè)數(shù)從左向右讀和從右向左讀是完全ー樣的),為95859。兩小時(shí)后里程表上出現(xiàn)了一個(gè)新的對稱數(shù)。問該車的速度是多少?新的對稱數(shù)是多少??問題分析與算法設(shè)計(jì)根據(jù)題意,設(shè)所求對稱數(shù)為i,其初值為95589,對其依次遞增取值,將i值的每一位分解后與其對稱位置上的數(shù)進(jìn)行比較,若每個(gè)對稱位置上的數(shù)皆相等,則可判定i即為所求的對稱數(shù)。?程序說明與注釋#include<stdio.h>intmain(){intt,a[5];/運(yùn)行結(jié)果Thenewsymmetricalnumberkelometersis:95959.Thevelocityofthecaris:50.00數(shù)組a運(yùn)行結(jié)果Thenewsymmetricalnumberkelometersis:95959.Thevelocityofthecaris:50.00longintk,i;for6=9586〇;;i++)/?以95860為初值,循環(huán)試探?/{for(t二〇,k=100000;k>=10;t++)/?從高到低分解所取i值的每位數(shù)?/{/?字,依次存放于a[0F放于中?/a[t]=(i%k)/(k/10);k/=10;}if((a[0]==a[4])&&(a[l]=a[3]))(printf(z,Thenewsymmetricalnumberkelometersis:%d%d%d%d%d\n/z,a[0],a[l],a[2],a[3],a[4]);printf("Thevelocityofthecaris:%.2f\n”,(i-95859)/2.0);break;23.由兩個(gè)平方三位數(shù)獲得三個(gè)平方二位數(shù)摘要已知兩個(gè)平方三位數(shù)abc和xyz,其中a、b、c>x、y、z未必是不同的:而ax、by>cz是三個(gè)平方二位數(shù)。請編程求三位數(shù)abc和xyz。任取兩個(gè)平方三位數(shù)n和nl,將n從高向低分解為a、b、c,將nl從高到低分解為x、y、z。判斷ax、by、cz是否均為完全平方數(shù)。已知兩個(gè)平方三位數(shù)abc和xyz,其中a、b、c、x、y、z未必是不同的:而ax、by、cz是三個(gè)平方二位數(shù)。請編程求三位數(shù)abc和xyzo問題分析與算法設(shè)計(jì)任取兩個(gè)平方三位數(shù)n和nl,將n從高向低分解為a、b、c,將nl從高到低分解為x、y、Zc判斷ax、by、cz是否均為完全平方數(shù)。程序說明與注釋#include<stdio.h>includeくmath.h>voidf(intn,float*s);intmain(){inti,t;floata[3],b[3];print('Thepossibleperfectsquarescombinationsare:\n");for(i=l1;iく=31;++i)〃窮舉平方三位數(shù)的取值范圍for(t=l1;t<=31;++t){f(i*i,a);〃分解平方三位數(shù)的各位,每位數(shù)字分別存入數(shù)組中f(t*t,b);if(sqrt(a[0]*10+b[0j)=(int)sqrt(a[〇]*10+b[〇])&&sqrt(a[l]*10+b[l])=(int)sqrt(a[l]*10+b[l])&&sqrt(a[2]*10+b[2])=(int)sqrt(a[2]*10+b[2]))(printfぐ%dand%d\n,i*i,t*t");〃若三個(gè)新的數(shù)均是完全平方數(shù),則輸出/* 分解三位數(shù)n的各位數(shù)字,將各個(gè)數(shù)字從高到低依次存入指針s所指向的數(shù)組中 */voidf(intn,float*s)intk;for(k=1000;k>=10;++s)(*s=(n%k)/(k/10);k/=10;)}?運(yùn)行結(jié)果Thepossibleperfectsquarescombinationsare:400and900841and19624.阿姆斯特朗數(shù)摘要ー個(gè)正整數(shù)等于其各個(gè)數(shù)字的立方和,則稱該數(shù)為阿姆斯特朗數(shù)(亦稱為自戀性數(shù))。如407=43+03+73就是ー個(gè)阿姆斯特朗數(shù)。求1000以內(nèi)的所有阿姆斯特朗數(shù)。用窮舉法,依次取1000以內(nèi)的各數(shù)i,將i的各位數(shù)字分解后,據(jù)阿姆斯特朗數(shù)的性質(zhì)進(jìn)行計(jì)算和判斷。如果一個(gè)正整數(shù)等于其各個(gè)數(shù)字的立方和,則稱該數(shù)為阿姆斯特朗數(shù)(亦稱為自戀性數(shù))。如407=43+03+73就是ー個(gè)阿姆斯特朗數(shù)。試編程求1000以內(nèi)的所有阿姆斯特朗數(shù)。?問題分析與算法設(shè)計(jì)可采用窮舉法,依次取1000以內(nèi)的各數(shù)(設(shè)為i),將i的各位數(shù)字分解后,據(jù)阿姆斯特朗數(shù)的性質(zhì)進(jìn)行計(jì)算和判斷。?程序說明與注釋#include<stdio.h>intmain(){inti,t,k,a[3];printflFherearefolIwingArmstrongnumbersmallerthan1000:、n〃);for(i=2;i<1000;i++)/?窮舉要判定的數(shù)i的取值范圍2、1000?/{for(t=0,k=1000;k>=10;t++)/?截取整數(shù)i的各位(從高向低位)運(yùn)行結(jié)果TherearefollowingArmstrongnumbersmallerthan運(yùn)行結(jié)果TherearefollowingArmstrongnumbersmallerthan1000:153370371407(a[t]=(i%k)/(k/10);/*分別賦于a[0]"a[2)*/k/=10;}if(a[0]*a[0]*a[0]+a[1]*a[1]*a[1]+a[2]*a[2]*a[2]==i)/?判斷i是否為阿姆斯特朗數(shù)?/printf("%5d”,i);/?若滿足條件,則輸出?/printf('\n");25.完全數(shù)摘要如果ー個(gè)數(shù)恰好等于它的因子之和,則稱該數(shù)為“完全數(shù)”〇問題分析與算法設(shè)計(jì):根據(jù)完全數(shù)的定義,先計(jì)算所選取的整數(shù)a(a的取值「1000)的因子,將各因子累加于m,若m等于a,則可確認(rèn)a為完全數(shù)。如果ー個(gè)數(shù)恰好等于它的因子之和,則稱該數(shù)為“完全數(shù)”。?問題分析與算法設(shè)計(jì)根據(jù)完全數(shù)的定義,先計(jì)算所選取的整數(shù)a(a的取值ピ1000)的因子,將各因子累加于m,若m等于a,則可確認(rèn)a為完全數(shù)。?程序說明與注釋#include<stdio.h>intmain(){inta,i,m;print"Fherearefollowingperfectnumberssmallerthan1000:\n運(yùn)行結(jié)果TTherearefollowingperfectnumberssmallerthan運(yùn)行結(jié)果TTherearefollowingperfectnumberssmallerthan1000:628496for(a=1;aく1000;a++)/?循環(huán)控制選取l~1000中的各數(shù)進(jìn)行判斷?/{for(m=0,i=l;i<=a/2;i++)/?計(jì)算a的因子,并將各因子之和m=a,則a是完全數(shù)輸出?/if(!(a%i))m+=i;if(m==a)printf("%4d”,a);}printf("\n");26.親密數(shù)摘要按親密數(shù)定義,要判斷數(shù)a是否有親密數(shù),只要計(jì)算出a的全部因子的累加和為b,再計(jì)算b的全部因子的累加和為n,若n等于a則可判定a和b是親密數(shù)。計(jì)算數(shù)a的各因子的算法:用a依次對i(i=l~a/2)進(jìn)行模運(yùn)算,若模運(yùn)算結(jié)果等于0,則i為a的ー個(gè)因子;否則i就不是a的因子。如果整數(shù)A的全部因子(包括1,不包括A本身)之和等于B:且整數(shù)B的全部因子(包括1,不包括B本身)之和等于A,則將整數(shù)A和B稱為親密數(shù)。求3000以內(nèi)的全部親密數(shù)。問題分析與算法設(shè)計(jì)按照親密數(shù)定義,要判斷數(shù)a是杳有親密數(shù),只要計(jì)算出a的全部因子的累加和為b,再計(jì)算b的全部因子的累加和為n,若n等于a則可判定a和b是親密數(shù)。計(jì)算數(shù)a的各因子的算法:用a依次對i(i=l~a/2)進(jìn)行模運(yùn)算,若模運(yùn)算結(jié)果等于。,則i為a的一個(gè)因子;否則i就不是a的因子。程序說明與注釋#include<stdio.h>intmain()(inta,i,b,n;printf(''Therearefollowingfriendly-numberspairsmallerthan3000:、n");for(a=l;a<3000;a++)/?窮舉1000以內(nèi)的全部整數(shù)?/(for(b=0,i=l;i<=a/2;i++)/?計(jì)算數(shù)a的各因子,各因子之和存放于b*/if(!(a%i))b+=i;/?計(jì)算b的各因子,各因子之和存于n*/for(n=0,i=l;i<=b/2;i++)if(!(b%i))n+=i;if(n==a&&a<b)printf("%4d.?%4d a,b);/?若n=a,則a和b是ー對親密數(shù),輸出?/運(yùn)行結(jié)果Therearefollowingfriendlyーーnumberspairsmallerthan3000:220..2841184..12102620..292427.自守?cái)?shù)摘要自守?cái)?shù)是指ー個(gè)數(shù)的平方的尾數(shù)等于該數(shù)自身的自然數(shù)。例如:252=625762=577693762=87909376請求出20000〇以內(nèi)的自守?cái)?shù)。本問題所關(guān)心的是積的最后三位。分析產(chǎn)生積的后三位的過程,可以看出,在每一次的部分積中,并不是它的每一位都會(huì)對積的后三位產(chǎn)生影響。自守?cái)?shù)是指ー個(gè)數(shù)的平方的尾數(shù)等于該數(shù)自身的自然數(shù)。例如:252=625762=577693762=87909376請求出200000以內(nèi)的自守?cái)?shù)?問題分析與算法設(shè)計(jì)若采用“求出ー個(gè)數(shù)的平方后再截取最后相應(yīng)位數(shù)”的方法顯然是不可取的,因?yàn)橛?jì)算機(jī)無法表示過大的整數(shù)。分析手工方式下整數(shù)平方(乘法)的計(jì)算過程,以376為例:376被乘數(shù)X376乘數(shù)2256第一個(gè)部分積=被乘數(shù)?乘數(shù)的倒數(shù)第一位2632第二個(gè)部分積=被乘數(shù)?乘數(shù)的倒數(shù)第二位1128第三個(gè)部分枳=被乘數(shù)?乘數(shù)的倒數(shù)第三位141376積本問題所關(guān)心的是積的最后三位。分析產(chǎn)生積的后三位的過程,可以看出,在每一次的部分積中,并不是它的每一位都會(huì)對積的后三位產(chǎn)生影響??偨Y(jié)規(guī)律可以得到:在三位數(shù)乘法中,對積的后三位產(chǎn)生影響的部分積分別為:第一個(gè)部分積中:被乘數(shù)最后三位?乘數(shù)的倒數(shù)第一位第二個(gè)部分積中:被乘數(shù)最后二位*乘數(shù)的倒數(shù)第二位第三個(gè)部分積中:被乘數(shù)最后一位?乘數(shù)的倒數(shù)第三位將以上的部分積的后三位求和后截取后三位就是三位數(shù)乘積的后三位。這樣的規(guī)律可以推廣到同樣問題的不同位數(shù)乘積。按照手工計(jì)算的過程可以設(shè)計(jì)算法編寫程序。?程序說明與注釋#include<stdio.h>intmain(){longmul,number,k,11,kk;printf('Itexistsfollowingautomorphicnmberssmallthan200000:、n");for(number=0;number<200000;number++)for(mul=number,k=l;(mul/=10)>0;k*=10);/?山number的位數(shù)確定截取數(shù)字進(jìn)行乘法時(shí)的系數(shù)k*/kk=k運(yùn)行結(jié)果Itexstsfollowingautomorphicnumbnerssmallerthan200000:0156257637662593769062510937610;/*kk運(yùn)行結(jié)果Itexstsfollowingautomorphicnumbnerssmallerthan200000:01562576376625937690625109376mu1=0;/?積的最后n位?/11=10;/*11為截取乘數(shù)相應(yīng)位時(shí)的系數(shù)?/while(k>0){mul=(mu1+(number%(k*10))*(number%!1-number%(11/10)))%kk;/*(部分積+截取被乘數(shù)的后N位*截取乘數(shù)的第M位),%kk再截取部分積?/k/=10;/*k為截取被乘數(shù)時(shí)的系數(shù)?/11*=10;)if(number==mul)/?判斷若為自守?cái)?shù)則輸出?/printf(*%ld",number);28.回文數(shù)摘要打印所有不超過n的其平方具有對稱性質(zhì)的數(shù)(也稱回文數(shù))。對于要判斷的數(shù)n.計(jì)算出其平方后(存于a),將a的每一位進(jìn)行分解,再按a的從低到髙的順序?qū)⑵浠謴?fù)成一個(gè)數(shù)k(如n=13,則a=169且k=961),若a等于k則可判定n為回文數(shù)。打印所有不超過n(取n<256)的其平方具有對稱性質(zhì)的數(shù)(也稱回文數(shù))。問題分析與算法設(shè)計(jì)對于要判斷的數(shù)n,計(jì)算出其平方后(存于a),將a的每一位進(jìn)行分解,再按a的從低到高的順序?qū)⑵浠謴?fù)成一個(gè)數(shù)k(如n=13,則a=169且k=961),若a等于k則可判定n為回文數(shù)。程序說明與注釋原程序好像有錯(cuò),而且比較費(fèi)解,現(xiàn)基于原程序修改如下(如果讀者還發(fā)現(xiàn)錯(cuò)誤請?zhí)岢觯?include<stdio.h>intmain(void)intm[16],n,i,t,count=0;longunsigneda,k;printflNo.numberit'ssquare(palindrome)\nf);for(n=l;n<256;n++)/?窮舉n的取值范圍?/k=0;t=l;a=n*n;/?計(jì)算n的平方?/for(i=0;a!=0;i++)/?從低到高分解數(shù)a的每一位存于數(shù)組m[0「m[16]*/(m[i]=a%10;〃這個(gè)是取得a的個(gè)位,整個(gè)循環(huán)合起來就可以取得各個(gè)位a/=10;intj=0;for(i—;jくi;j++,i—)〃因?yàn)閚的平方的各個(gè)位都存在數(shù)組中了,下面判斷是不是對稱if(m[j]!=m[i])break;〃只要有一位不是對稱,那就說明不是對稱,就可以退出了〃所有的位都對稱就說明是對稱了,這樣就可以打印出結(jié)果了if(j>=i)printf(*%2d%10d%10d\n*,++count,n,n*n);return0;運(yùn)行結(jié)果No.numberit'ssquare(palindrome)1112243394111215224846266767101102018111123219121146411020240804112124494438.換分幣

摘要用一元人民幣兌換成1分、2分和5分硬幣,共有多少種不同的兌換方法。問題分析與算法設(shè)計(jì):根據(jù)題意設(shè)i,j,k分別為兌換的1分、2分、5分硬幣所具有的錢數(shù)(分),則i,j,k的值應(yīng)滿足:i+j+k=100用一元人民幣兌換成1分、2分和5分硬幣,共有多少種不同的兌換方法。問題分析與算法設(shè)計(jì)根據(jù)題意設(shè)i,j,k分別為兌換的1分、2分、5分硬幣所具有的錢數(shù)(分),則i,j,k的值應(yīng)滿足:i+j+k=100程序說明與注釋#include<stdio.h>intmain()(inti,j,k,count=l;printf("Therearefoilwingsmallexchangeplansfor1Yuannote:\n");for(i=0;i<=100;i++)/*i為1分硬幣錢數(shù),可取值0,1,2...,100*/for(

溫馨提示

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

評論

0/150

提交評論