C語(yǔ)言趣味程序百例_第1頁(yè)
C語(yǔ)言趣味程序百例_第2頁(yè)
C語(yǔ)言趣味程序百例_第3頁(yè)
C語(yǔ)言趣味程序百例_第4頁(yè)
已閱讀5頁(yè),還剩163頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

C/C++趣味程序百例(獻(xiàn)給C/C++初學(xué)者)(轉(zhuǎn))1.繪制余弦曲線在屏幕上用“*"顯示。、360度的余弦函數(shù)cos(x)曲線?問(wèn)題分析與算法設(shè)計(jì)如果在程序中使用數(shù)組,這個(gè)問(wèn)題十分簡(jiǎn)單。但若規(guī)定不能使用數(shù)組,問(wèn)題就變得不容易了。關(guān)鍵在于余弦曲線在。、360度的區(qū)間內(nèi),一行中要顯示兩個(gè)點(diǎn),而對(duì)一般的顯示器來(lái)說(shuō),只能按行輸出,即:輸出第一行信息后,只能向下一行輸出,不能再返回到上一行。為了獲得本文要求的圖

形就必須在ー行中一次輸出兩個(gè)“ボ’。為了同時(shí)得到余弦函數(shù)cos(x)圖形在一行上的兩個(gè)點(diǎn),考慮利用cos(x)的左右對(duì)稱性。將

屏幕的行方向定義為x,列方向定義為y,則〇?180度的圖形與180~360度的圖形是左右對(duì)稱的,若定義圖

形的總寬度為62列,計(jì)算出x行〇?180度時(shí)y點(diǎn)的坐標(biāo)m,那么在同一行與之對(duì)稱的180?360度的y點(diǎn)的坐標(biāo)

就應(yīng)為62-m。程序中利用反余弦函數(shù)acos計(jì)算坐標(biāo)(x,y)的對(duì)應(yīng)關(guān)系。

使用這種方法編出的程序短小精煉,體現(xiàn)了一定的技巧。?程序說(shuō)明與注釋#include<stdio.h>

#include<math.h>

intmain()Idoubley;intx,m;for(y=l;y>=-l;y-=0.1)/*y為列方向,值從1到T,步長(zhǎng)為0.1*/m=acos(y)*10;/?計(jì)算出y對(duì)應(yīng)的弧度m,乘以10為圖形放大倍數(shù)?/

for(x=l;x<m;x++)printf(**);printf("才);/?控制打印左側(cè)的?號(hào)?/for(;xく62-m;x++)printf("");printf(,z*\n");/*控制打印同一行中對(duì)稱的右側(cè)?號(hào)?/

)return0;?思考題如何實(shí)現(xiàn)用“ボ‘顯示〇?360度的sin(x)曲線。在屏幕上顯示〇、360度的cos(x)曲線與直線f(x)=45*(yT)+31的迭加圖形。其中cos(x)

圖形用“ジ表示,f(x)用表示,在兩個(gè)圖形相交的點(diǎn)上則用f(x)圖形的符號(hào)。2.繪制余弦曲線和直線?問(wèn)題分析與算法設(shè)計(jì)本題可以在上題的基礎(chǔ)上進(jìn)行修改。圖形迭加的關(guān)鍵是要在分別計(jì)算出同一行中兩個(gè)圖形的

列方向點(diǎn)坐標(biāo)后,正確判斷相互的位置關(guān)系。為此,可以先判斷圖形的交點(diǎn),再分別控制打印兩個(gè)不同的

圖形。?程序注釋與說(shuō)明#include<stdio.h>

#include<math.h>

intmain()

{

doubley;intx,m,n,yy;for(yy=0;yy<=20;yy++)/?對(duì)于第一個(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)對(duì)應(yīng)的屏幕列坐標(biāo)?/

n=45*(y-1)+31;/*n:直線上y點(diǎn)對(duì)應(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");}return0;

}?思考題

如何實(shí)現(xiàn)sin(x)曲線與cos(x)曲線圖形的同時(shí)顯示。3.繪制圓在屏幕上用“才’畫(huà)一個(gè)空心的圓?問(wèn)題分析與算法設(shè)計(jì)打印圓可利用圖形的左右對(duì)稱性。根據(jù)圓的方程:

R*R=X*X+Y*丫可以算出圓上每一點(diǎn)行和列的對(duì)應(yīng)關(guān)系。?程序說(shuō)明與注釋#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對(duì)應(yīng)的列坐標(biāo)m,2.5是屏幕縱橫比調(diào)節(jié)系數(shù)因?yàn)槠聊坏?/p>

行距大于列距,不進(jìn)行調(diào)節(jié)顯示出來(lái)的將是橢圓?/

for(x=l;x<30-m;x++)printfC");/?圖形左側(cè)空白控制?/

printf("*");/?圓的左側(cè)?/

for(;x<30+m;x++)printfCつ;/?圖形的空心部分控制?/

printf("*\n");/?圓的右側(cè)?/}return0;?思考題實(shí)現(xiàn)函數(shù)y=x2的圖形與圓的圖形疊加顯示4.歌星大獎(jiǎng)賽在歌星大獎(jiǎng)賽中,有10個(gè)評(píng)委為參賽的選手打分,分?jǐn)?shù)為廣100分。選手最后得分為:去

掉ー個(gè)最高分和ー個(gè)最低分后其余8個(gè)分?jǐn)?shù)的平均值。請(qǐng)編寫(xiě)ー個(gè)程序?qū)崿F(xiàn)。?問(wèn)題分析與算法設(shè)計(jì)這個(gè)問(wèn)題的算法十分簡(jiǎn)單,但是要注意在程序中判斷最大、最小值的變量是如何賦值的。?程序說(shuō)明與注釋#include<stdio.h>

intmain()

{

intinteger,i,max,min,sum;max=-32768;/*先假設(shè)當(dāng)前的最大值max為C語(yǔ)言整型數(shù)的最小值?/

min-32767;/?先假設(shè)當(dāng)前的最小值min為C語(yǔ)言整型數(shù)的最大值?/

sum=0;/*將求累加和變量的初值置為0?/for(i=l;i<=10;i++)

{printf("Inputnumber/d=",i);scanf("%d",&integer);/*輸入評(píng)委的評(píng)分?/

sum+=integer;/?計(jì)算總分?/if(integer>max)max=integer;/?通過(guò)比較篩選出其中的最高分?/

if(integer<min)min=integer;/?通過(guò)比較篩選出其中的最低分?/

}printf(^Canceledmaxscore:%d\nCanceledminscore:%d\n*,max,min);

printf(""Averagescore:%d\n”,(sum-max-min)/8);/?輸出結(jié)果?/)?運(yùn)行結(jié)果Inputnumber1=90Inputnumber2=91Inputnumber3=93Inputnumber4=94Inputnumber5=90Inputnumber6=99Inputnumber7=97Inputnumber8=92Inputnumber9=91Inputnumber10=95Canceledmaxscore:99Canceledminscore:90Averagescore:92?思考題題目條件不變,但考慮同時(shí)對(duì)評(píng)委評(píng)分進(jìn)行裁判,即在10個(gè)評(píng)委中找出最公平(即評(píng)分最接

返平均分)和最不公平(即與平均分的差距最大)的評(píng)委,程序應(yīng)該怎樣實(shí)現(xiàn)?5,求最大數(shù)問(wèn)555555的約數(shù)中最大的三位數(shù)是多少??問(wèn)題分析與算法設(shè)計(jì)根據(jù)約數(shù)的定義,對(duì)于ー個(gè)整數(shù)N,除去1和它自身外,凡能整除N的數(shù)即為N的約數(shù)。因

此,最簡(jiǎn)單的方法是用2到N-1之間的所有數(shù)去除N,即可求出N的全部約數(shù)。本題只要求取約數(shù)中最大的三

位數(shù),則其取值范

圍可限制在!00到999之間。?程序說(shuō)明與注釋#include<stdio.h>

intmain()

{longi;

intj;printf("めleaseinputnumber:");scanf&i);for(j=999:j>=100;j-)

if(i%j==O){printf(*Themaxfactorwith3digitsin%ldis:%d,\n*,i,j);

break;*運(yùn)行結(jié)果輸入:555555輸出:Themaxfactorwith3digitsin555555is:7776.高次方數(shù)的尾數(shù)求13的13次方的最后三位數(shù)?問(wèn)題分析與算法設(shè)計(jì)解本題最直接的方法是:將13累乘13次方截取最后三位即可。但是由于計(jì)算機(jī)所能表示的整數(shù)范圍有限,用這種“正確”的算法不可能得到正確的結(jié)果。

事實(shí)上,題目?jī)H要求最后三位的值,完全沒(méi)有必要求!3的13次方的完整結(jié)果。研究乘法的規(guī)律發(fā)現(xiàn):乘積的最后三位的值只與乘數(shù)和被乘數(shù)的后三位有關(guān),與乘數(shù)和被乘

數(shù)的高位無(wú)關(guān)

。利用這ー規(guī)律,可以大大簡(jiǎn)化程序。?程序說(shuō)明與注釋#include<stdio.h>intmain()

inti,x,y,last=l;/?變量last保存求X的Y次方過(guò)程中的部分乘積的后三位?/

printf("InputXandY(X**Y):");scanf("%d**%d",&x,&y);for(i=l;i<=y;i++)/*X自乘丫次?/last=last*x%1000;/?將last乘X后對(duì)1000取模,即求積的后三位?/

printf("Thelast3digitsof%d**%dis:%d\n",x,y,last%1000);/?打印結(jié)果?/

}?運(yùn)行結(jié)果InputXandY(X**Y):13**13Thelast3digitsof13**13is:253

InputXandY(X**Y):13**20

Thelast3digitsof13**20is:8017.階乘尾數(shù)零的個(gè)數(shù)

100!的尾數(shù)有多少個(gè)零??問(wèn)題分析與算法設(shè)計(jì)可以設(shè)想:先求出100!的值,然后數(shù)一下末尾有多少個(gè)零。事實(shí)上,與上題ー樣,由于計(jì)算機(jī)所能表示的整數(shù)范圍有限,這是不可能的。為了解決這個(gè)問(wèn)題,必須首先從數(shù)學(xué)上分析在100!結(jié)果值的末尾產(chǎn)生零的條件。不難

看出:ー個(gè)整數(shù)若含有一個(gè)因子5,則必然會(huì)在求100!時(shí)產(chǎn)生一個(gè)零。因此問(wèn)題轉(zhuǎn)化為求1到100這100

個(gè)整數(shù)中包含了多少個(gè)因子5。若整數(shù)N能被25整除,則N包含2個(gè)因子5;若整數(shù)N能被5整除,則N包含!個(gè)因子5。?程序說(shuō)明與注釋#include<stdio.h>intmain()

inta,count=0;for(a=5;a〈=100;a+=5)〃循環(huán)從5開(kāi)始,以5的倍數(shù)為步長(zhǎng),考察整數(shù)

(

++count;//若為5的倍數(shù),計(jì)數(shù)器加1

if(!(a%25))++count;〃若為25的倍數(shù),計(jì)數(shù)器再加1}printf(*Thenumberof0intheendof100!is:%d.\n*,count);//打印結(jié)果

return0;)?運(yùn)行結(jié)果Thenumberof0intheendof100!is:24.?問(wèn)題進(jìn)ー步討論本題的求解程序是正確的,但是存在明顯的缺點(diǎn)。程序中判斷整數(shù)N包含多少個(gè)因子5的方

法是與程序中的100有關(guān)的,若題目中的100改為1000,則就要修改程序中求因子5的數(shù)目的算法了。?思考題修改程序中求因子5的數(shù)目的算法,使程序可以求出任意N!的末尾有多少個(gè)零。8.借書(shū)方案知多少小明有五本新書(shū),要借給A,B,C三位小朋友,若每人每次只能借一本,則可以有多少種不同的借法??問(wèn)題分析與算法設(shè)計(jì)本問(wèn)題實(shí)際上是一個(gè)排列問(wèn)題,即求從5個(gè)中取3個(gè)進(jìn)行排列的方法的總數(shù)。首先對(duì)五本書(shū)

從1至5進(jìn)行編號(hào),然后使用窮舉的方法。假設(shè)三個(gè)人分別借這五本書(shū)中的一本,當(dāng)三個(gè)人所借的書(shū)的編號(hào)都

不相同時(shí),就是滿足題意的ー種借閱方法。?程序說(shuō)明與注釋

intmain()

inta,b,c,count=0;printflTherearediffrentmethodsforXMtodistributebooksto3readers:\n");

for(a=l;a<=5;a++)/?窮舉第一個(gè)人借5本書(shū)中的1本的全部情況?/

for(b=l;b<=5;b++)/?窮舉第二個(gè)人借5本書(shū)中的一本的全部情況?/for(c=l;a!=b&&c<=5;c++)/?當(dāng)前兩個(gè)人借不同的書(shū)時(shí),窮舉第三個(gè)人借5本書(shū)

中的1本的全部情況?/if(c!=a&&c!=b)/*判斷第三人與前兩個(gè)人借的書(shū)是否不同?/

printf(count%8?^%2d:%d,%d,%d":"%2d:%d,%d,%d\n”,++count,a,b,c);/?打印可能的借閱方法?/

)?運(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,39.楊輝三角形在屏幕上顯示楊輝三角形12113311464115101051?問(wèn)題分析與算法設(shè)計(jì)楊輝三角形中的數(shù),正是(x+y)的N次方累展開(kāi)式各項(xiàng)的系數(shù)。本題作為程序設(shè)計(jì)中具有代

表性的題目,求解的方法很多,這里僅給出一種。從楊輝三角形的特點(diǎn)出發(fā),可以總結(jié)出:D第N行有N+1個(gè)值(設(shè)起始行為第。行)2)對(duì)于第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+l

c(x,y)=

c(x-l,y-l)+c(x-l,y)其它本程序應(yīng)是根據(jù)以上遞歸的數(shù)學(xué)表達(dá)式編制的。?程序說(shuō)明與注釋#include<stdio.h>

intmain()

{

inti,j,n=13;

printf("N=”);

while(n>12)scanf("釈T,&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列,則輸出I?/

z=c(x-l,yT)+c(xT,y);/?否則,其值為前一行中第y-1列與第y列值之和?/

returnz;?思考題自行設(shè)計(jì)ー種實(shí)現(xiàn)楊輝三角形的方法10,數(shù)制轉(zhuǎn)換將任一整數(shù)轉(zhuǎn)換為二進(jìn)制形式?問(wèn)題分析與算法設(shè)計(jì)將卜進(jìn)制整數(shù)轉(zhuǎn)換為二進(jìn)制的方法很多,這里介紹的實(shí)現(xiàn)方法利用了c語(yǔ)言能夠?qū)ξ贿M(jìn)行操

作的特點(diǎn)。對(duì)于C語(yǔ)言來(lái)說(shuō),一個(gè)整數(shù)在計(jì)算機(jī)內(nèi)就是以二進(jìn)制的形式存儲(chǔ)的,所以沒(méi)有必要再將一個(gè)整

數(shù)經(jīng)過(guò)ー系列的運(yùn)算轉(zhuǎn)換為二進(jìn)制形式,只要將整數(shù)在內(nèi)存中的二進(jìn)制表示輸出即可。?程序說(shuō)明與注釋#include<stdio.h>voidprintb(int,int);intmain(){intx;printf〈Inputnumber:;scanf("%d",&x);printf(z,numberofdecimalform:%d\nzz,x);printf(zzit'sbinaryform:zz);printb(x,sizeof(int)*8);/*x:整數(shù)sizeof(int):int型在內(nèi)存中所占的字節(jié)數(shù)sizeof(int)*8:int型對(duì)應(yīng)的位數(shù)?/

putchar('\n);)voidprintb(intx,intn)(

if(n>0)

(putchar(*0*+((unsigned)(x&(l?(n-l)))?(n-l)));/*輸出第n位?/

printb(x,n-1);/?歸調(diào)用,輸出x的后nT位?/)}?運(yùn)行結(jié)果

輸入:8

輸出:numberofdecimalform:8it'sbunaryform:0000000000001000

輸入:-8輸出:numberofdecimalform:-8it'sbinaryform:1111111111111000

輸入:32767輸出:numberofdecimalform:32767it'sbinaryform:0111111111111111輸入:-32768輸出:numberofdecimalform:-32768it'sbinaryform:1000000000000000

輸入:128輸出:numberofdecimalform:128it'sbinaryform:0000000010000000?問(wèn)題的進(jìn)ー步討論充分利用C語(yǔ)言可以對(duì)位進(jìn)行操作的特點(diǎn),可以編寫(xiě)許多其它高級(jí)語(yǔ)言不便于編寫(xiě)甚至根本

無(wú)法編寫(xiě)的程

序。位操作是c語(yǔ)言的一大特點(diǎn),在深入學(xué)習(xí)c語(yǔ)言的過(guò)程中應(yīng)カ求很好掌握。程序中使用的位運(yùn)算方法不是最佳的,也可以不用遞歸操作,大家可以自行對(duì)程序進(jìn)行優(yōu)化。?思考題將任意正整數(shù)轉(zhuǎn)換為四進(jìn)制或ハ進(jìn)制數(shù)11.打魚(yú)還是曬網(wǎng)中國(guó)有句俗語(yǔ)叫“三天打魚(yú)兩天曬網(wǎng)”。某人從1990年1月1日起開(kāi)始“三天打魚(yú)兩天曬

網(wǎng)”,問(wèn)這個(gè)人在以后的某ー天中是“打魚(yú)”還是“曬網(wǎng)”。?問(wèn)題分析與算法設(shè)計(jì)根據(jù)題意可以將解題過(guò)程分為三步:1)計(jì)算從1990年1月1日開(kāi)始至指定日期共有多少天;2)由于“打魚(yú)”和“曬網(wǎng)”的周期為5天,所以將計(jì)算出的天數(shù)用5去除;3)根據(jù)余數(shù)判斷他是在“打魚(yú)”還是在“曬網(wǎng)”;若余數(shù)為1,2,3.則他是在“打魚(yú)”否則是在“曬網(wǎng)”在這三步中,關(guān)鍵是第一步。求從1990年1月1日至指定日期有多少天,要判斷經(jīng)歷年份

中是否有閏年,二月為29天,平年為28天。閏年的方法可以用偽語(yǔ)句描述如下:如果((年能被4除盡且不能被100除盡)或能被400除盡)

則該年是閏年;

否則不是閏年。C語(yǔ)言中判斷能否整除可以使用求余運(yùn)算(即求模)?程序說(shuō)明與注釋#include<stdio.h>intdays(structdateday);structdate{intyear;intmonth;intday;);intmain()

structdatetoday,term;intyearday,year,day;printf("Enteryear/month/day:");scanf("%d%d%dz,,&today.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("hewasfishingatthatday.\n");/?打印結(jié)果?/

elseprintf("Hewassleepingatthatday.\n");)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!=01Iday.year%400==0;/?判定year為閏年還是平年,lp=0為平年,非〇為閏年?/for(i=l;i<day.month;i++)/?計(jì)算本年中自1月1日起的天數(shù)?/day.day+=day_tab[Ip];returnday.day;}?運(yùn)行結(jié)果Enteryear/month/day:19911025Hewasfishingatday.Enteryear/month/day:19921025

Hewassleepingatday.Enteryear/month/day:19931025

Hewassleepingatday.?思考題

請(qǐng)打印出任意年份的日歷12.抓交通肇事犯ー輛卡車(chē)違反交通規(guī)則,撞人后逃跑?,F(xiàn)場(chǎng)有三人目擊事件,但都沒(méi)有記住車(chē)號(hào),只記下車(chē)

號(hào)的ー些特征?甲說(shuō):牌照的前兩位數(shù)字是相同的;乙說(shuō):牌照的后兩位數(shù)字是相同的,但與前兩位不同;

丙是數(shù)學(xué)家,他說(shuō):四位的車(chē)號(hào)剛好是ー個(gè)整數(shù)的平方。請(qǐng)根據(jù)以上線索求出車(chē)號(hào)。?問(wèn)題分析與算法設(shè)計(jì)

按照題目的要求造出ー個(gè)前兩位數(shù)相同、后兩位數(shù)相同且相互間又不同的整數(shù),然后判斷該

整數(shù)是否是另ー個(gè)整數(shù)的平方。?程序說(shuō)明與注釋

#include<stdio.h>#include<math.h>

intmain()

(

inti,j,k,c;for(i=l;i〈=9;i++)/*i:車(chē)號(hào)前二位的取值?/for(j=0;j〈=9;j++)/*j:車(chē)號(hào)后二位的取值?/

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.\n",k);/?若是,打印結(jié)果?/?運(yùn)行結(jié)果Lorry_No.is774413.該存多少錢(qián)假設(shè)銀行一年整存零取的月息為0.63機(jī)現(xiàn)在某人手中有一筆錢(qián),他打算在今后的五年中的

年底取出1000元,到第五年時(shí)剛好取完,請(qǐng)算出他存錢(qián)時(shí)應(yīng)存入多少。?問(wèn)題分析與算法設(shè)計(jì)分析存錢(qián)和取錢(qián)的過(guò)程,可以采用倒推的方法。若第五年年底連本帶息要取1000元,則要

先求出第五年年初銀行存款的錢(qián)數(shù):第五年初存款=1000/(1+12*0.0063)依次類(lèi)推可以求出第四年、第三年……的年初銀行存款的錢(qián)數(shù):

第四年年初存款=(第五年年初存款+1000)/(1+12*0.0063)

第三年年初存款=(第四年年初存款+1000)/(1+12*0.0063)

第二年年初存款=(第三年年初存款+1000)ハ1+12*0.0063)

第一年年初存款=(第二年年初存款+1000)/(1+12*0.0063)通過(guò)以上過(guò)程就可以很容易地求出第一年年初要存入多少錢(qián)。?程序說(shuō)明與注釋#include<stdio.h>

intmainO

{

inti;floattotal=0;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);}?運(yùn)行結(jié)果Hemustsave4039.44atfirst14.怎樣存錢(qián)利最大假設(shè)銀行整存整取存款不同期限的月息利率分別為:0.63%期限=1年0.66%期限=2年0.69%期限=3年0.75%期限=5年0.84%期限=8年利息=本金?月息利率?12?存款年限?,F(xiàn)在某人手中有2000元錢(qián),請(qǐng)通過(guò)計(jì)算選擇ー種存錢(qián)方案,使得錢(qián)存入銀行20年后得到的

利息最多(假定銀行對(duì)超過(guò)存款期限的那一部分時(shí)間不付利息)。?問(wèn)題分析與算法設(shè)計(jì)為了得到最多的利息,存入銀行的錢(qián)應(yīng)在到期時(shí)馬上取出來(lái),然后立刻將原來(lái)的本金和利息

加起來(lái)再作為新的本金存入銀行,這樣不斷地滾動(dòng)直到滿20年為止,由于存款的利率不同,所以不同的

存款方法(年限)存20年得到的利息是不一樣的。分析題意,設(shè)2000元存20年,其中1年存il次,2年存i2次,3年存i3次,5年存i5

次,8年存i8次,則到期時(shí)存款人應(yīng)得到的本利合計(jì)為:2000*(l+ratel)il*(l+rate2)i2*(l+rate3)i3*(l+rate5)i5*(l+rate8)i8

其中rateN為對(duì)應(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ì)算出最大值,

就是最佳存款方案。?程序說(shuō)明與注釋#include<stdio.h>#include<math.h>

intmain()

(inti8,i5,i3,i2,il,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++)

{il=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=il;n2=i2;n3=i3;n5=i5;n8=i8;}}printf(〃Formaxinumprofit,heshouldsosavehismoneyinabank:\n);printf(z/madefixeddepositfor8year:%dtimes'n”,n8);printf(z/madefixeddepositfor5year:%dtimes'n”,n5);printfl made fixed deposit for 3 year: %d times\n,z,n3);printfl made fixed deposit for 2 year: %d times\n,z,n2);printfl made fixed deposit for 1 year: %d times'n”,nl);printf("Toal:%.2f\n”,max);/?輸出存款方式?/?運(yùn)行結(jié)果Formaxinumprofit,heshouldsosavehismoneyinabank:

madefixeddepositfor8year:Otimes

madefixeddepositfor5year:4times

madefixeddepositfor3year:Otimes

madefixeddepositfor2year:Otimes

madefixeddepositfor1year:OtimesTotal:8841.01可見(jiàn)最佳的存款方案為連續(xù)四次存5年期。?思考題某單位對(duì)職エ出售住房,每套為2萬(wàn)元。買(mǎi)房付款的方法是:

一次交清,優(yōu)惠20%從第一年開(kāi)始,每年年初分期付款:

5年交清,優(yōu)惠50%;

10年交清,優(yōu)惠10%;

20年交清,沒(méi)有優(yōu)惠?,F(xiàn)在有人手中正好有2萬(wàn)元,若假定在今后20年中物價(jià)和銀行利率均保持不變,問(wèn)他應(yīng)當(dāng)

選擇哪種付款方式可以使應(yīng)付的錢(qián)最少?15.捕魚(yú)和分魚(yú)A、B、C、D、E五個(gè)人在某天夜里合伙去捕魚(yú),到第二天凌晨時(shí)都疲憊不堪,于是各自找地

方睡覺(jué)。日上

三桿,A第一個(gè)醒來(lái),他將魚(yú)分為五份,把多余的一條魚(yú)扔掉,拿走自己的一份。B第二個(gè)

醒來(lái),也將魚(yú)分為五份,把多余的一條魚(yú)扔掉,保持走自己的ー份。c、D、E依次醒來(lái),也按同樣的方法拿

走魚(yú)。問(wèn)他們

合伙至少捕了多少條魚(yú)??問(wèn)題分析與算法設(shè)計(jì)

根據(jù)題意,總計(jì)將所有的魚(yú)進(jìn)行了五次平均分配,每次分配時(shí)的策略是相同的,即扔掉一條

魚(yú)后剩卜ー的魚(yú)正好分成五份,然后拿走自己的一份,余下其它的四份。假定魚(yú)的總數(shù)為X,則X可以按照題目的要求進(jìn)行五次分配:XT后可被5整除,余下的魚(yú)

為4*(X-1)、5?若X滿足上述要求,則X就是題目的解。?程序說(shuō)明與注釋#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*(xT)/5;elseflag=0;/?若不能分配則置標(biāo)記falg=0退出分配過(guò)程?/

if(flag)break;/?若分配過(guò)程正常結(jié)束則找到結(jié)果退出試探的過(guò)程?/

elseflag=l;/?否則繼續(xù)試探下一個(gè)數(shù)?/}printf("Totalnumberoffishcatched=%d\n",n);/?輸出結(jié)果?/

}?運(yùn)行結(jié)果Totalnumberoffishcatched=3121?問(wèn)題的進(jìn)ー步討論程序采用試探法,試探的初值為6,每次試探的步長(zhǎng)為1。這是過(guò)分保守的做法。可以在進(jìn)ー步分析題目的

基礎(chǔ)上修改此值,增大試探的步長(zhǎng)值,以減少試探次數(shù)。?思考題請(qǐng)使用其它的方法求解本題。16.出售金魚(yú)買(mǎi)賣(mài)提將養(yǎng)的ー缸金魚(yú)分五次出售系統(tǒng)上一次賣(mài)出全部的一半加二分之一條:第二次賣(mài)出余

下的三分之ー加三分之一條;第三次賣(mài)出余下的四分之一加四分之一條;第四次賣(mài)出余下的五分之一加五

分之一條;最

后賣(mài)出余下的11條。問(wèn)原來(lái)的魚(yú)缸中共有幾條金魚(yú)??問(wèn)題分析與算法設(shè)計(jì)題目中所有的魚(yú)是分五次出售的,每次賣(mài)出的策略相同;第j次賣(mài)剩下的(j+D分之一再加

l/(j+l)條。第五次將第四次余下的11條全賣(mài)了。假定第j次魚(yú)的總數(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開(kāi)始,試探的步長(zhǎng)

為2,因?yàn)閄的值

一定為奇數(shù)。?程序說(shuō)明與注釋

#include<stdio.h>

intmain()

inti,j,n=0,x;/*n為標(biāo)志變量?/

for(i=23;n==0;i+=2)/?控制試探的步長(zhǎng)和過(guò)程?/

(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ì)算過(guò)程?/

if(j==5&&x==ll)/?若第四次余下11條則滿足題意?/

(printf("Thereare%dfishesatfirst.\n",i);/?輸出結(jié)果?/

n=l;/?控制退出試探過(guò)程?/!?運(yùn)行結(jié)果Thereare59fishesatfirst.?思考題日本著名數(shù)學(xué)游戲?qū)<抑写辶x作教授提出這樣ー個(gè)問(wèn)題:父親將2520個(gè)桔子分給六個(gè)兒子。

分完后父親說(shuō):“老大將分給你的桔子的1/8給老二;老二拿到后連同原先的桔子分1/7給老三;老三拿

到后連同原先的桔子分1/6給老四:老四拿到后連同原先的桔子分1/5給老五;老五拿到后連同原先的桔子分1/4給老六;老六拿到后連同原先的桔子分1/3給老大”。結(jié)果大家手中的桔子正好一樣多。問(wèn)六兄弟原

來(lái)手中各有多少桔子?17.平分七筐魚(yú)甲、乙、丙三位魚(yú)夫出海打魚(yú),他們隨船帶了21只蘿筐。當(dāng)晚返航時(shí),他們發(fā)現(xiàn)有七筐裝

滿了魚(yú),還有七筐裝了半筐魚(yú),另外七筐則是空的,由于他們沒(méi)有秤,只好通過(guò)目測(cè)認(rèn)為七個(gè)滿筐魚(yú)的重量

是相等的,7個(gè)半筐魚(yú)的重量是相等的。在不將魚(yú)倒出來(lái)的前提ト,怎樣將魚(yú)和筐平分為三份??問(wèn)題分析與算法設(shè)計(jì)根據(jù)題意可以知道:每個(gè)人應(yīng)分得七個(gè)等筐,其中有3.5筐魚(yú)。采用ー個(gè)3*3的數(shù)組a來(lái)表

示三個(gè)人分到的東西。其中每個(gè)人對(duì)應(yīng)數(shù)組a的一行,數(shù)組的第0列放分到的魚(yú)的整筐數(shù),數(shù)組的第1列放分到的半筐數(shù),數(shù)組的第2列放分到的空筐數(shù)。由題目可以推出:。數(shù)組的每行或每列的元素之和都為?;。對(duì)數(shù)組的行來(lái)說(shuō),滿筐數(shù)加半筐數(shù)=3.5;。每個(gè)人所得的滿筐數(shù)不能超過(guò)3筐;。每個(gè)人都必須至少有1個(gè)半筐,且半筐數(shù)一定為奇數(shù)對(duì)于找到的某種分魚(yú)方案,三個(gè)人誰(shuí)拿哪ー份都是相同的,為了避免出現(xiàn)重復(fù)的分配方案,

可以規(guī)定:第二個(gè)人的滿筐數(shù)等于第一個(gè)人的滿筐數(shù);第二個(gè)人的半筐數(shù)大于等于第一個(gè)人的半筐數(shù)。?程序說(shuō)明與注釋#include<stdio.h>

inta[3][3],count;

intmain()

(

inti,j,k,m,n,flag;

printf(,zItexistspossibledistribtionplans:\nzz);

for(i=0;i<=3;i++)/?試探第一個(gè)人滿筐a[〇][〇]的值,滿筐數(shù)不能>3*/

{a[〇][〇]二i;for(j=i;j<=7-i&&j<=3;j++)/?試探第二個(gè)人滿筐a[l][0]的值,滿筐數(shù)不能>3*/

a[l][0]=j;

if((a[2][0]二7-j-a[〇][〇])>3)continue;/*第三個(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è)人分到的魚(yú)是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=O;/?不符合題意則置標(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é)果Itexistspossibledistributionplans:No.1FullbasketSemi-basketEmpty

fisherA:151

fisherB:313

fisherC:313No.2FullbasketSemi-basketEmpty

fisherA:232

fisherB:232

fisherC:313?思考題晏會(huì)上數(shù)學(xué)家出了一道難題:假定桌子上有三瓶啤酒,癬瓶子中的酒分給幾個(gè)人喝,但喝各

瓶酒的人數(shù)是不一樣的。不過(guò)其中有一個(gè)人喝了每ー瓶中的酒,且加起來(lái)剛好是ー瓶,請(qǐng)問(wèn)喝這三瓶酒的各有多少人?(答案:喝三瓶酒的人數(shù)分別是2人、3人和6人)18.有限5位數(shù)個(gè)位數(shù)為6且能被3整除的五位數(shù)共有多少??題目分析與算法設(shè)計(jì)根據(jù)題意可知,滿足條件的五位數(shù)的選擇范圍是10006、10016。。。99996。可設(shè)基礎(chǔ)數(shù)i=1000,

通過(guò)計(jì)算i*10+6即可得到欲選的數(shù)(i的變化范圍是1000、999),再判斷該數(shù)能否被3整除。?程序說(shuō)明與注釋

#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ù)?/printf("count=%d\n”,count);

}?運(yùn)行結(jié)果count=2999?思考題求100到1000之間有多少個(gè)其數(shù)字之和為5的整數(shù)。(答案:104,113,122,131,140,203,212,221,230,302,311,320,401,410,500)8除不盡的自然數(shù)ー個(gè)自然數(shù)被8除余1,所得的商被8除也余1,再將第二次的商被8除后余7,最后得到

ー個(gè)商為a。又知這個(gè)自然數(shù)被17除余4,所得的商被!7除余15,最后得到ー個(gè)商是a的2倍。求這個(gè)自然數(shù)。?問(wèn)題分析與算法設(shè)計(jì)根據(jù)題意,可設(shè)最后的商為i(i從〇開(kāi)始取值),用逆推法可以列出關(guān)系式:(((i*8+7)*8)+1)*8+1=((2*i*17)+15)*18+4

再用試探法求出商i的值。?程序說(shuō)明與注釋

#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\nz,,(34*1+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ù)。?問(wèn)題分析與算法設(shè)計(jì)

根據(jù)題意可知,七進(jìn)制和九進(jìn)制表示的這全自然數(shù)的每一位一定小于7,可設(shè)其七進(jìn)制數(shù)形

式為kji(i、jヽk的取值分別為廣6),然后設(shè)其九進(jìn)制表示形式為ijk。?程序說(shuō)明與注釋

#include<stdio.h>

intmainO

{

inti,j,k;for(i=l;i<7:i++)for(j=0;j<7;j++)

for(k=l;k<7;k++)

if(i*9*9+j*9+k==i+j*7+k*7*7)

{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);}

i?運(yùn)行結(jié)果Thespecialnumberwith3digitsis:503(7)=305(9)=248(10)

21.4位反序數(shù)設(shè)N是ー個(gè)四位數(shù),它的9倍恰好是其反序數(shù),求N。反序數(shù)就是將整數(shù)的數(shù)字倒過(guò)來(lái)形成的整數(shù)。例如:1234的反序數(shù)是4321,?問(wèn)題分析與算法設(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)成No?程序說(shuō)明與注釋

#include<stdio.h>

intmain()

(

inti;for(i=1002;i++)/?窮舉四位數(shù)可能的值?/

if(i%10*1000+i/10%10*100+i/100%10*10+i/1000==i*9)

/*判斷反序數(shù)是否是原整數(shù)的9倍?/printflThenumbersatisfiedstatsconditionis:/d\n,i);

/?若是則輸出?/}?運(yùn)行結(jié)果Thenumbersatisfiedstatesconditionis:108922.求車(chē)速ー輛以固定速度行駛的汽車(chē),司機(jī)在上午10點(diǎn)看到里程表上的讀數(shù)是ー個(gè)對(duì)稱數(shù)(即這個(gè)數(shù)

從左向右讀和從右向左讀是完全ー樣的),為95859。兩小時(shí)后里程表上出現(xiàn)了一個(gè)新的對(duì)稱數(shù)。問(wèn)該車(chē)

的速度是多少?新的對(duì)稱數(shù)是多少??問(wèn)題分析與算法設(shè)計(jì)

根據(jù)題意,設(shè)所求對(duì)稱數(shù)為i,其初值為95589,對(duì)其依次遞增取值,將i值的每一位分解

后與其對(duì)稱位置上的數(shù)進(jìn)行比較,若每個(gè)對(duì)稱位置上的數(shù)皆相等,則可判定i即為所求的對(duì)稱數(shù)。?程序說(shuō)明與注釋#include<stdio.h>

intmain()

(intt,a[5];/*數(shù)組a存放分解的數(shù)字位*/

longintk,i;for(i=95860;;i++)/?以95860為初值,循環(huán)試探?/

{for(t=0,k=100000;k>=10;t++)/?從高到低分解所取i值的每位數(shù)?/

{/?字,依次存放于a[0]?a[5]中?/a[t]=(i%k)/(k/10);k/=10;

)

if((a[0]==a[4])&&(a[l]=a[3]))

(printf("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;

}

i

}?運(yùn)行結(jié)果Thenewsymmetricalnumberkelometersis:95959.Thevelocityofthecaris:50.00?思考題將一個(gè)數(shù)的數(shù)碼倒過(guò)來(lái)所得到的新數(shù)叫原數(shù)的反序數(shù)。如果ー個(gè)數(shù)等于它的反序數(shù),則稱它

為對(duì)稱數(shù)。求不超過(guò)!993的最大的二進(jìn)制的對(duì)稱數(shù)。23.由兩個(gè)平方三位數(shù)獲得三個(gè)平方二位數(shù)已知兩個(gè)平方三位數(shù)abc和xyz,其中a、b、c>x、y、z未必是不同的;而ax、by、cz是

三個(gè)平方二位數(shù)。請(qǐng)編程求三位數(shù)abc和xyz。?問(wèn)題分析與算法設(shè)計(jì)

任取兩個(gè)平方三位數(shù)n和nl,將n從高向低分解為a、b、c,將nl從高到低分解為x、y、

Zo判斷ax、by、cz是否均為完全平方數(shù)。?程序說(shuō)明與注釋#include<stdio.h>

#include<math.h>

voidf(intn,float*s);

intmain()

{

inti,t;floata[3],b[3];print(,zThepossibleperfectsquarescombinationsare:\n,z);

for(i=ll;i<=31;++i)〃窮舉平方三位數(shù)的取值范圍

for(t=ll;t<=31;++t){

f(i*i,a);〃分解平方三位數(shù)的各位,每位數(shù)字分別存入數(shù)組中

f(t*t,b);if(sqrt(a[0]*10+b[0])=(int)sqrt(a[〇]*10+b[0])&&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:400and900841and196?思考題求這樣ー個(gè)三位數(shù),該三位數(shù)等于其每位數(shù)字的階乘之和。即abc=a!+b!+c!(正確結(jié)果:145=1!+4!+5!)24.阿姆斯特朗數(shù)如果ー個(gè)正整數(shù)等于其各個(gè)數(shù)字的立方和,則稱該數(shù)為阿姆斯特朗數(shù)(亦稱為自戀性數(shù))。

如407=43+03+73就是ー個(gè)阿姆斯特朗數(shù)。試編程求1000以內(nèi)的所有阿姆斯特朗數(shù)。?問(wèn)題分析與算法設(shè)計(jì)可采用窮舉法,依次取1000以內(nèi)的各數(shù)(設(shè)為i),將i的各位數(shù)字分解后,據(jù)阿姆斯特朗

數(shù)的性質(zhì)進(jìn)行計(jì)算

和判斷。?程序說(shuō)明與注釋

#include<stdio.h>

intmain()

{inti,t,k,a[3];printf<TherearefoilwingArmstrongnumbersmallerthan1000:\n);

for(i=2;i<1000;i++)/*窮舉要判定的數(shù)i的取值范圍2、1000?/(for(t=0,k=1000;k>=10;t++)/*截取整數(shù)i的各位(從高向低位)*/(a[t]=(i%k)/(k/10);/?分別賦于a[0]'a[2)*/

k/=10;)if(a[0]*a[0]*a[0]+a[l]*a[l]*a[l]+a[2]*a[2]*a[2]==i)/*判斷i是否為阿姆斯特朗數(shù)?/

printf("%5d",i);/?若滿足條件,則輸出?/)

printf("\n");?運(yùn)行結(jié)果

TherearefollowingArmstrongnumbersmallerthan1000:15337037140725.完全數(shù)如果ー個(gè)數(shù)恰好等于它的因子之和,則稱該數(shù)為“完全數(shù)”。?問(wèn)題分析與算法設(shè)計(jì)根據(jù)完全數(shù)的定義,先計(jì)算所選取的整數(shù)a(a的取值「1000)的因子,將各因子累加于m,

若m等于a,則可確認(rèn)a為完全數(shù)。?程序說(shuō)明與注釋

#include<stdio.h>

intmain()(

inta,i,m;printflTherearefollowingperfectnumberssmallerthan1000:、n");for(a=1;a<1000;a++)/?循環(huán)控制選取P1000中的各數(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");}?運(yùn)行結(jié)果TTherearefollowingperfectnumberssmallerthan1000:62849626.親密數(shù)如果整數(shù)A的全部因子(包括1,不包括A本身)之和等于B;且整數(shù)B的全部因子(包括1,

不包括B本身)之和

等于A,則將整數(shù)A和B稱為親密數(shù)。求3000以內(nèi)的全部親密數(shù)。?問(wèn)題分析與算法設(shè)計(jì)按照親密數(shù)定義,要判斷數(shù)a是否有親密數(shù),只要計(jì)算出a的全部因子的累加和為b,再計(jì)

算b的全部因子的累加和為n,若n等于a則可判定a和b是親密數(shù)。計(jì)算數(shù)a的各因子的算法:

用a依次對(duì)i(i=l?a/2)進(jìn)行模運(yùn)算,若模運(yùn)算結(jié)果等于。,則i為a的ー個(gè)因子:否則i就不是a的因子。?程序說(shuō)明與注釋

#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=1;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是ー對(duì)親密數(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請(qǐng)求出200000以內(nèi)的自守?cái)?shù)?問(wèn)題分析與算法設(shè)計(jì)若采用“求出ー個(gè)數(shù)的平方后再截取最后相應(yīng)位數(shù)”的方法顯然是不可取的,因?yàn)橛?jì)算機(jī)無(wú)法表示過(guò)大的

整數(shù)。分析手工方式下整數(shù)平方(乘法)的計(jì)算過(guò)程,以376為例:376被乘數(shù)X376乘數(shù)2256第一個(gè)部分積=被乘數(shù)?乘數(shù)的倒數(shù)第一位

2632第二個(gè)部分積=被乘數(shù)?乘數(shù)的倒數(shù)第二位

1128第三個(gè)部分積=被乘數(shù)?乘數(shù)的倒數(shù)第三位141376積本問(wèn)題所關(guān)心的是積的最后三位。分析產(chǎn)生積的后三位的過(guò)程,可以看出,在每一次的部分

積中,并不是它的每一位都會(huì)對(duì)積的后三位產(chǎn)生影響??偨Y(jié)規(guī)律可以得到:在三位數(shù)乘法中,對(duì)積的后三

位產(chǎn)生影響的部分積分別為:第一個(gè)部分積中:被乘數(shù)最后三位?乘數(shù)的倒數(shù)第一位

第二個(gè)部分積中:被乘數(shù)最后二位?乘數(shù)的倒數(shù)第二位

第三個(gè)部分積中:被乘數(shù)最后一位?乘數(shù)的倒數(shù)第三位將以上的部分積的后三位求和后截取后三位就是三位數(shù)乘積的后三位。這樣的規(guī)律可以推廣

到同樣問(wèn)題的不同位數(shù)乘積。按照手工計(jì)算的過(guò)程可以設(shè)計(jì)算法編寫(xiě)程序。?程序說(shuō)明與注釋#include<stdio.h>

intmain()

{longmul,number,k,11,kk;printf(Z/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*10;/*kk為截取部分積時(shí)的系數(shù)?/

mul=0;/?枳的最后n位?/11=10;/*11為截取乘數(shù)相應(yīng)位時(shí)的系數(shù)?/

while(k>0)

(mul=(mu1+(number%(k*10))*(number%11-number%(11/10)))%kk;/*(部分積+截取被乘數(shù)的后N位*截取乘數(shù)的第M位),%kk再截取部分積?/

k/=10;/*k為截取被乘數(shù)時(shí)的系數(shù)?/ll*=10;

)

if(number=mul)/*判斷若為自守?cái)?shù)則輸出?/

printf1%ld,number);

)

)?運(yùn)行結(jié)果Itexstsfollowingautomorphicnumbnerssmallerthan200000:0156257637662593769062510937628.回文數(shù)打印所有不超過(guò)n(取n<256)的其平方具有對(duì)稱性質(zhì)的數(shù)(也稱回文數(shù))。?問(wèn)題分析與算法設(shè)計(jì)對(duì)于要判斷的數(shù)n,計(jì)算出其平方后(存于a),將a的每一位進(jìn)行分解,再按a的從低到高

的順序?qū)⑵浠謴?fù)成ー個(gè)數(shù)k(如n=13,則a=169且k=961),若a等于k則可判定n為回亠數(shù)。?程序說(shuō)明與注釋原程序好像有錯(cuò),而且比較費(fèi)解,現(xiàn)基于原程序修改如下(如果讀者還發(fā)現(xiàn)錯(cuò)誤請(qǐng)?zhí)岢?:#include<stdio.h>

intmain(void)intm[16],n,i,t,count=0;longunsigneda,k;printf(^No.numberit'ssquare(palindrome)\n/z);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二a%10;〃這個(gè)是取得a的個(gè)位,整個(gè)循環(huán)合起來(lái)就可以取得各個(gè)位a/=10;}intj=0;for(i-;jくi;j++,i-)〃因?yàn)閚的平方的各個(gè)位都存在數(shù)組中了,下面判斷是不是對(duì)稱

if(m[j]!=m)break;〃只要有一位不是對(duì)稱,那就說(shuō)明不是對(duì)稱,就可以退出了//所有的位都對(duì)稱就說(shuō)明是對(duì)稱了,這樣就可以打印出結(jié)果了if(j>=i)printf(*%2d%10d%10d\n*,++count,n,n*n);}return0;}?運(yùn)行結(jié)果No.numberit'ssquare(palindrome)111224339411121522484626676710110201

81111232191211464110202408041121244944〃下面程序是原來(lái)的,有錯(cuò),而且費(fèi)解#include<stdio.h>

intmain(void)

(intm[16],n,i,t,count=0;longunsigneda,k;printf("No.numberit'ssquare(palindrome)\n*);for(n=l;nく256;n++)/?窮舉n的取值范圍?/

{k=0;t=l;a=n*n;/?計(jì)算n的平方?/for(i=l;a!=0;i++)/?從低到髙分解數(shù)a的每一位存于數(shù)組m[l]"m[16]*/

(m二a%10;〃安安注:這個(gè)是取得a的個(gè)位,整個(gè)循環(huán)合起來(lái)就可以取得各個(gè)位,并存于數(shù)組中,

為了是下面判斷是不是對(duì)稱

a/=10;)for(;i>l;i-)

(k+=m[i-l]*t;t*二10;

)

if(k==n*n)printf(*%2d%10d%10d\n,z,++count,n,n*n);

)

return0;?運(yùn)行結(jié)果No.numberit'ssquare(palindrome)112433941112152248462667671011020181111232191211464129.求具有abed=(ab+cd)2性質(zhì)的四位數(shù)3025這個(gè)數(shù)具有一種獨(dú)特的性質(zhì):將它平分為ニ段,即30和25,使之相加后求平方,即

(30+25)2,恰好等于3025本身。請(qǐng)求出具有這樣性質(zhì)的全部四位數(shù)。?問(wèn)題分析與算法設(shè)計(jì)具有這種性質(zhì)的四位數(shù)沒(méi)有分布規(guī)律,可以采用窮舉法,對(duì)所有四位數(shù)進(jìn)行判斷,從而篩選

出符合這種性質(zhì)的四位數(shù)。具體算法實(shí)現(xiàn),可任取ー個(gè)四位數(shù),將其截為兩部分,前兩位為a,后兩位為

b,然后套用公式計(jì)算并判斷。?程序說(shuō)明與注釋

#include<stdio.h>

intmain()

{intn,a,b;printf("Therearefollowingnumberwith4digitssatisfiedcondition\n");for(n=l000;n<l0000;n++)/?四位數(shù)N的取值范圍100〇、9999*/

a=n/100;/?截取N的前兩位數(shù)存于a*/b=n%100;/?截取N的后兩位存于b*/

if((a+b)*(a+b)==n)/?判斷N是否為符合題目所規(guī)定的性質(zhì)的四位數(shù)?/

printf(*%d",n);}

i?運(yùn)行結(jié)果Therearefollowingnumberswith4digitssatisfiedcondition:20253025980130.求素?cái)?shù)求素?cái)?shù)表中「1000之間的所有素?cái)?shù)?問(wèn)題分析與算法設(shè)計(jì)素?cái)?shù)就是僅能衩1和它自身整除的整數(shù)。判定一個(gè)整數(shù)n是否為素?cái)?shù)就是要判定整數(shù)n能否

被除1和它自身之外的任意整數(shù)整除,若都不能整除,則n為素?cái)?shù)。程序設(shè)計(jì)時(shí)i可以從2開(kāi)始,到該整數(shù)n的1/2為止,用i依次去除需要判定的整數(shù),只要

存在可以整除該數(shù)的情況,即可確定要判斷的整數(shù)不是素?cái)?shù),否則是素?cái)?shù)。?程序說(shuō)明與注釋#include<stdio.h>

intmain()

{

intnl,nm,i,j,flag,count=0;

do{

printf("InputSTARTandEND=?”);

scanf("%d%d,z,&nl,&nm);/*輸入求素?cái)?shù)的范圍?/

}while(!(nl>0&&nl<nm));/?輸入正確的范圍?/printf(*\n”,nl,nm);printf(*if(nl=l||nl=2)/?處理素?cái)?shù)2*/

(printf("%4d”,2);nl=3;count++;)for(i=nl;i<=nm;i++)/?判定指定范圍內(nèi)的整數(shù)是否為素?cái)?shù)?/

(if(!(i%2))continue;for(flag=l,j=3;flag&&j<i/2;j+=2)/?判定能否被從3到整數(shù)的一半中的某一數(shù)所整除?/if(!(i%_j))flag=0;/*若能整除則不是素?cái)?shù)?/if(flag)printf(++count%15?*%4d*:*%4d\n*,i);}

}?思考題請(qǐng)找出十個(gè)最小的連續(xù)自然數(shù),它們個(gè)個(gè)都是合數(shù)(非素?cái)?shù))31.歌德巴赫猜想驗(yàn)證:2000以內(nèi)的正偶數(shù)都能夠分解為兩個(gè)素?cái)?shù)之和(即驗(yàn)證歌徳巴赫猜想對(duì)2000以內(nèi)的

正偶數(shù)成立)。?問(wèn)題分析與算法設(shè)計(jì)為了驗(yàn)證歌德巴赫猜想對(duì)2000以內(nèi)的正偶數(shù)都是成立的,要將整數(shù)分解為兩部分,然后判

斷出分解出的兩個(gè)整數(shù)是否均為素?cái)?shù)。若是,則滿足題意;否則重新進(jìn)行分解和判斷。程序中對(duì)判斷是否為素?cái)?shù)的算法進(jìn)行了改進(jìn),對(duì)整數(shù)判斷“用從2開(kāi)始到該整數(shù)的一半”改

為“2開(kāi)始到該整數(shù)的平方根”。原因何在請(qǐng)自行分析。?程序說(shuō)明與注釋#include<stdio.h>

#include<math.h>

intfflag(intn);

intmain()

(

inti,n;for(i=4;i<=2000;i+=2)

(for(n=2;n<i;n++)/?將偶數(shù)i分解為兩個(gè)整數(shù)*/

if(fflag(n))/?分別判斷兩個(gè)整數(shù)是否均為素?cái)?shù)?/

if(fflag(i-n))(printfC%14d=%d+%d\n",i,n,i-n);/*若均是素?cái)?shù)則輸出?/

break;)if(n==i)printf("error%d\n",i);intfflag(inti)/?判斷是否為素?cái)?shù)*/

(

intj;if(i<=l)return0;if(i==2)return1;if(!(i%2))return0;/*ifno,return0*/

for(j=3;j<=(int)(sqrt((double)i)+l);j+=2)

if(!(i%j))return0;return1;/*ifyes,return1*/

}32.可逆素?cái)?shù)求四位的可逆素?cái)?shù)??赡嫠?cái)?shù)指:ー個(gè)素?cái)?shù)將其各位數(shù)字的順序倒過(guò)來(lái)構(gòu)成的反序數(shù)也是素

數(shù)。?問(wèn)題分析與算法設(shè)計(jì)本題的重點(diǎn)不是判斷素?cái)?shù)的方法,而是求一個(gè)整數(shù)的反序數(shù)。求反序數(shù)的方法是從整數(shù)

的末尾依次截取最后一位數(shù)字,每截取一次后整數(shù)縮小10倍,將截取的數(shù)字作為新的整數(shù)的最后一位(新

的整數(shù)擴(kuò)大10倍后加上被截取的數(shù)字)〇這樣原來(lái)的整數(shù)的數(shù)字從低到高被不斷地截取,依次作為新的整

數(shù)從高到低的各位數(shù)字。?程序說(shuō)明與注釋#include<stdio.h>#include<math.h>intnum(intnumber);intok(intnumber);intmain()(inti,count;printf("Thereareinvertableprimeswith4digits:\n");for(count=0,i=1001;i<9999;i+=2)〃窮舉全部的奇數(shù){if(num(i))〃若是可逆素?cái)?shù),則輸出printf(count%9?"%3d:%d":"%3d:%d\n",++count,i);}return0;}intnum(intnumber){inti,j;if(!ok(number))return0:〃判斷是否為素?cái)?shù)for(i=number,j=0;i>0;i/=10)〃按位將整數(shù)倒過(guò)來(lái),產(chǎn)生反序數(shù)j=j*10+i%10;}if(number<j)〃若原數(shù)小于反序數(shù)

{if(!ok(i))〃判斷對(duì)應(yīng)的反序數(shù)是否為可逆素?cái)?shù)

{return0;)else

{

return1;〃若是可逆數(shù)素?cái)?shù),則返回1

}

)else

(

return0;}

getchar();

return0;)intok(intnumber)

(inti,j;if(number%2=0)〃判斷是否為素?cái)?shù)

return0;j=sqrt((double)number)+1;//取整數(shù)的平方根為判斷的上限

for(i=3;i<j;i+=2)(if(number%i=0)//若為素?cái)?shù)則返回1,否則返回0

return0;}?思考題求1000以內(nèi)的攣生素?cái)?shù)。學(xué)生素?cái)?shù)是指:若a為素?cái)?shù),且a+2也是素?cái)?shù),則素?cái)?shù)a和a+2

稱為學(xué)生素?cái)?shù)。33.回文素?cái)?shù)求不超過(guò)1000的回文素?cái)?shù)。?問(wèn)題分析與算法設(shè)計(jì)所謂回文素?cái)?shù)是指,對(duì)ー個(gè)整數(shù)n從左向右和從由向左讀其結(jié)果值相同且是素?cái)?shù),即稱n為回文素?cái)?shù)。所以本題的重點(diǎn)不是判斷素?cái)?shù)的方法,而是求回文整數(shù)。構(gòu)造回文數(shù)的方法很多,這里僅介

紹一種最簡(jiǎn)單的算法。實(shí)現(xiàn)思路是先求出ー個(gè)整數(shù)的回文數(shù),再判斷是否為素?cái)?shù)。不超過(guò)!000的回文數(shù)包括二位和三位的回文數(shù),我們采用窮舉法來(lái)構(gòu)造ー個(gè)整數(shù)并求與其對(duì)應(yīng)的反序數(shù),若整數(shù)與其反序數(shù)相等,則該整數(shù)是回文數(shù)。?程序說(shuō)明與注釋

#include<stdio.h>inta(intn)

intmain()

{inti,j,t,k,s;printf(,zFollowingarepalindromeprimesnotgreaterthan1000:、n");for(i=0;i<=9;++i)〃窮舉第一位for(j=0;j<=9;++j)〃窮舉第二位for(k二〇;kく=9;++k)〃窮舉第三位

s=i*100+j*10+k;〃計(jì)算組成的整數(shù)

t=ik*100+j*10+i;〃計(jì)算對(duì)應(yīng)的反序數(shù)if(i==0&&j==0)〃處理整數(shù)的前兩位為〇的情況

t/100;elseif(i==0)//處理整數(shù)的第一

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論