下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
C/C++語言經(jīng)典、實(shí)用、趣味程序設(shè)計(jì)編程百例精解(1).繪制余弦曲線在屏幕上用、'*''顯示0-360度的余弦函數(shù)cos(x)曲線問題分析與算法設(shè)計(jì)如果在程序中使用數(shù)組,這個(gè)問題十分簡單。但若規(guī)定不能使用數(shù)組,問題就變得不容易了。關(guān)鍵在于余弦曲線在〇?360度的區(qū)間內(nèi),一行中要顯示兩個(gè)點(diǎn),而對一般的顯示器來說,只能按行輸出,即:輸出第一行信息后,只能向下一行輸出,不能再返回到上一行。為了獲得本文要求的圖形就必須在一行中一次輸出兩個(gè)''*"。為了同時(shí)得到余弦函數(shù)cos(x)圖形在一行上的兩個(gè)點(diǎn),考慮利用cos(x)的左右対稱性。將屏幕的行方向定義為X,列方向定義為y,則0~180度的圖形與180-360度的圖形是左右對稱的,若定義闇形的總寬度為62歹リ,計(jì)算出x行0-180度時(shí)y點(diǎn)的坐標(biāo)m,那么在同一行與之對稱的180-360度的y點(diǎn)的坐標(biāo)就應(yīng)為62-mo程序中利用反余弦函數(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到ー1,步長為0.1*/{m=acos(y)*10;/?計(jì)算出y對應(yīng)的弧度m,乘以10為圖形放大倍數(shù)?/for(x=l;x<m;x++)printf("");printf("*");/*控制打印左側(cè)的?號(hào)?/for(;x<62-m;x++)printf("");printf("*\n");/?控制打印同一行中對稱的右側(cè)?號(hào)?/}return0;}思考題如何實(shí)現(xiàn)用''*"顯示0-360度的sin(x)曲線。在屏幕上顯示0-360度的cos(x)曲線與直線f(x)=45*(y-l)+31的迭加圖形。其中cos(x)圖形用''*"表示,f(x)用''+"表示,在兩個(gè)圖形相交的點(diǎn)上則用f(x)圖形的符號(hào)。.繪制余弦曲線和直線?問題分析與算法設(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;yyv=20;yy++)/?對于第一個(gè)y坐標(biāo)進(jìn)行計(jì)算并在一行中打印闇形?/{y=O.l*yy;/*y:屏幕行方向坐標(biāo)?/m=acos(l-y)*10;/*m:cos(x)曲線上y點(diǎn)對應(yīng)的屏幕列坐標(biāo)?/n=45*(y-l)+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í)打E卩、'+"*/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.繪制圓在屏幕上用、'*"畫一個(gè)空心的圓?問題分析與算法設(shè)計(jì)打印圓可利用圖形的左右對稱性。根據(jù)圓的方程:R*R=X*X+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;}?思考題實(shí)現(xiàn)函數(shù)y=x2的圖形與圓的圖形疊加顯示.歌星大獎(jiǎng)賽在歌星大獎(jiǎng)賽中,有10個(gè)評(píng)委為參賽的選手打分,分?jǐn)?shù)為1?100分。選手最后得分為:去掉ー個(gè)最高分和一個(gè)最低分后其余8個(gè)分?jǐn)?shù)的平均值。請編寫ー個(gè)程序?qū)崿F(xiàn)。問題分析與算法設(shè)計(jì)這個(gè)問題的算法十分簡單,但是要注意在程序中判斷最大、最小值的變量是如何賦值的。程序說明與注釋#include<stdio.h>intmain(){intinteger),max,min,sum;max=-32768;/?先假設(shè)當(dāng)前的最大值max為C語言整型數(shù)的最小值?/min=32767;/?先假設(shè)當(dāng)前的最小值min為C語言整型數(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;/?通過比較篩選出其屮的最高分?/if(integervmin)min=integer;/?通過比較篩選出其中的最低分?/}printf("Canceledmaxscore:%d\nCanceledminscore:%d\n",max,min);printf("Averagescore:%d\n",(sum-max-min)/8);/?輸出結(jié)果?/}運(yùn)行結(jié)果Inputnumberl=90Inputnumber2=91Inputnumber3=93Inputnumber4=94Inputnumber5=90Inputnumber6=99Inputnumber7=97Inputnumber8=92Inputnumber9=91Inputnumberl0=95Canceledmaxscore:99Canceledminscore:90Averagescore:92?思考題題目條件不變,但考慮同時(shí)對評(píng)委評(píng)分進(jìn)行裁判,即在10個(gè)評(píng)委中找出最公平(即評(píng)分最接返平均分)和最不公平(即與平均分的差距最大)的評(píng)委,程序應(yīng)該怎樣實(shí)現(xiàn)?.求最大數(shù)問555555的約數(shù)中最大的三位數(shù)是多少??問題分析與算法設(shè)計(jì)根據(jù)約數(shù)的定義,對于ー個(gè)整數(shù)N,除去1和它自身外,凡能整除N的數(shù)即為N的約數(shù)。因此,最簡單的方法是用2到N-1之間的所有數(shù)去除N,即可求出N的全部約數(shù)。本題只要求取約數(shù)中最大的三位數(shù),則其取值范圍可限制在100到999之間。?程序說明與注釋#include<stdio.h>intmain(){longI;intj;printf("Pleaseinputnumber:");scanf("%ld",&i);for(j=999;j>=100;j-)if(i%j==O){printf("Themaxfactorwith3digitsin%ldis:%d,\n",i,j);break;}}?運(yùn)行結(jié)果輸入:555555輸出:Themaxfactorwith3digitsin555555is:777.高次方數(shù)的尾數(shù)求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=l;/?變量last保存求X的丫次方過程中的部分乘積的后三位?/printf("InputXandY(X**Y):");scanf("%d**%d",&x,&y);for(i=l;i<=y;i++)/*X自乘Y次?/last=last*x%100〇;/?將(ast乘X后對!000取模,即求積的后三位?/printf("Thelast3digitsof%d**%dis:%d\n",x,y,last%1000);/?打印結(jié)果?/}*運(yùn)行結(jié)果InputXand丫(X**Y):13**13Thelast3digitsof13**13is:253InputXandY(X**Y):13**20Thelast3digitsof13**20is:8017.階乘尾數(shù)零的個(gè)數(shù)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=0;for(a=5;a<=100;a+=5)〃循環(huán)從5開始,以5的倍數(shù)為步長,考察整數(shù){++count;〃若為5的倍數(shù),計(jì)數(shù)器加1if(!(a%25))++countJ〃若為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ù)目的算法了。?思考題修改程序中求因子5的數(shù)目的算法,使程序可以求出任意N!的末尾有多少個(gè)零。8.借書方案知多少小明有五本新書,要借給A,B,C三位小朋友,若每人每次只能借一本,則可以有多少種不同的借法??問題分析與算法設(shè)計(jì)本問題實(shí)際上是一個(gè)排列問題,即求從5個(gè)中取3個(gè)進(jìn)行排列的方法的總數(shù)。首先對五本書從1至5進(jìn)行編號(hào),然后使用窮舉的方法。假設(shè)三個(gè)人分別借這五本書中的一本,當(dāng)三個(gè)人所借的書的編號(hào)都不相同時(shí),就是滿足題意的?種借閱方法。?程序說明與注釋intmain(){inta,b,c,count=0;printf("TherearediffrentmethodsforXMtodistributebooksto3readers:\n");for(a=l;a<=5;a++)/?窮舉第一個(gè)人借5本書中的1本的全部情況ッfor(b=l;bv=5;b++)/?窮舉第二個(gè)人借5本書中的一本的全部情況ッfor(c=l;a!=b&&cv=5;c++)/?當(dāng)前兩個(gè)人借不同的書時(shí),窮舉第三個(gè)人借5本書中的1本的全部情況ッif(c!=a&&c!=b)/*判斷第三人與前兩個(gè)人借的書是否不同?/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.楊輝三角形在屏幕上顯示楊輝三角形11112113311464115101051?問題分析與算法設(shè)計(jì)楊輝三角形中的數(shù),正是(x+y)的N次方塞展開式各項(xiàng)的系數(shù)。本題作為程序設(shè)計(jì)中具有代表性的題目,求解的方法很多,這里僅給出ー種。從楊輝三角形的特點(diǎn)出發(fā),可以總結(jié)出:1)第N行有N+!個(gè)值(設(shè)起始行為第0行)2)對于第N行的第J個(gè)值:(N>=2)當(dāng)」=1或J=N+1時(shí):其值為1J!=l且:l!=N+l時(shí):其值為第N-1行的第:1-1個(gè)值與第N-1行第J個(gè)值之和將這些特點(diǎn)提煉成數(shù)學(xué)公式可表示為:1x=1或x=N+1c(x,y)=c(x-l,y-l)+c(x-l,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;iv=n;i++)/?控制輸出N行?/for(j-0;j<24-2*i;j++)printf("");/*控制輸出第i行前面的空格?/for(j=l;j<i+2;j++)printf("%4d",c(i,j));/?輸出第i行的第j個(gè)值?/printf("\n");}}voidintc(intx,inty)/?求楊輝三角形中第x行第y列的值?/<intz;if((y==l)||(y==x+l))return1;/?若為x行的第1或第x+1列,則輸出1*/z=c(x-l/y-l)+c(x-l/y);/?否則,其值為前一行中第y-1列與第y列值之和?/returnz;)?思考題自行設(shè)計(jì)ー種實(shí)現(xiàn)楊輝三角形的方法10,數(shù)制轉(zhuǎn)換將任一整數(shù)轉(zhuǎn)換為二進(jìn)制形式?問題分析與算法設(shè)計(jì)將I?進(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);printf("it'sbinaryform:");printb(x,sizeof(int)*8);/*x:整數(shù)sizeof(int):int型在內(nèi)存中所占的字節(jié)數(shù)sizeof(int)*8:int型對應(yīng)的位數(shù)?/putchar('\n');)voidprintb(intx,intn){if(n>0){putchar('〇'+((unsigned)(x&(l<<(n-l)))>>(n-l)));/*輸出第n位?/printb(x,n-l);/?歸調(diào)用,輸出x的后n-1位?/}}?運(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?問題的進(jìn)ー步討論充分利用c語;可以對位進(jìn)行操作的特點(diǎn),可以編寫許多其它高級(jí)語言不便于編寫甚至根本無法編寫的程序。位操作是c語言的一大特點(diǎn),在深入學(xué)習(xí)c語言的過程中應(yīng)カ求很好掌握。程序中使用的位運(yùn)算方法不是最佳的,也可以不用遞歸操作,大家可以自行對程序進(jìn)行優(yōu)化。?思考題將任意正整數(shù)轉(zhuǎn)換為四進(jìn)制或ハ進(jìn)制數(shù)C/C++語言經(jīng)典、實(shí)用、趣味程序設(shè)計(jì)編程百例精解(2)11.打魚還是哂網(wǎng)中國有句俗語叫、、三天打魚兩天曬網(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(){structdatetodayzterm;intyearday,year,day;printf(HEnteryear/month/day:H);scanf("%d%d%d",&today.year,&today.month,&today.day);/?輸入日期?/term.month=12;/*設(shè)置變量的初始值:月?/term.day=31;/*設(shè)置變量的初始值:日?/for(yearday=0,year=1990;year<today.year;year+4-){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(HHewassleepingatthatday.\n");}intdays(structdateday){staticintday_tab[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,lp;lp=day.year%4==0&&day.year%100!=0||day.year%400==0;/?判定year為閏年還是平年,[p=o為平年,非〇為閏年?/for(i=l;ivday.month;i++)/?計(jì)算本年中自1月1日起的天數(shù)?/day.day+=day_tab[lp][i];returnday.day;??運(yùn)行結(jié)果Enteryear/month/day:19911025Hewasfishingatday.Enteryear/month/day:19921025Hewassleepingatday.Enteryear/month/day:19931025Hewassleepingatday.?思考題請打印出任意年份的口歷12.抓交通肇事犯一輛卡車違反交通規(guī)則,撞人后逃跑。現(xiàn)場有三人目擊事件,但都沒有記住車號(hào),只記下車號(hào)的ー些特征。甲說:牌照的前兩位數(shù)字是相同的;乙說:牌照的后兩位數(shù)字是相同的,但與前兩位不同;丙是數(shù)學(xué)家,他說:四位的車號(hào)剛好是ー個(gè)整數(shù)的平方。請根據(jù)以上線索求出車號(hào)。問題分析與算法設(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++)/*i:車號(hào)前二位的取值ッfor(j=0;j<=9;j++)/*j:車號(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.is7744.該存多少錢假設(shè)銀行一年整存零取的月息為0.63%。現(xiàn)在某人手中有一筆錢,他打算在今后的五年中的年底取出1000元,到第五年時(shí)剛好取完,請算出他存錢時(shí)應(yīng)存入多少。問題分析與算法設(shè)計(jì)分析存錢和取錢的過程,可以采用倒推的方法。若第五年年底連本帶息要取1000元,則要先求出第五年年初銀行存款的錢數(shù);第五年初存款=1000/(1+12*0.0063)依次類推可以求出第四年、第三年……的年初銀行存款的錢數(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=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.44atfirst.怎樣存錢利最大假設(shè)銀行整存整取存款不同期限的月息利率分別為:0.63%期限=1年0.66%期限=2年0.69%期限=3年0.75%期限=5年0.84%期限=8年利息=本金?月息利率?12?存款年限?,F(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*(l+ratel)il*(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,il,n8,n5,n3,n2,nl;floatmax=0,term;for(i8=0;i8V3;i8++)/?窮舉所有可能的存款方式*/for(i5=0;i5<=(20-8*i8)/5;i5++)for(i3=0;i3V=(20-8*i8?5*i5)/3;i3++)for(i2=0;i2V=(20-8*i8-5*i5-3*i3)/2;i2++)(il=20-8*i8-5*i5-3*i3-2*i2;term=2000.0*pow((double)(l+0.0063*12)z(double)il)*pow((double)(l+2*0.0063*12)z(double)i2)*pow((double)(l+3*0.0069*12)z(double)i3)*pow((double)(l+5*0.0075*12)z(double)i5)*pow((double)(l+8*0.0084*12)z(double)i8);/?計(jì)算到期時(shí)的木利合計(jì)?/if(term>max){max=term;nl=il;n2=i2;n3=i3;n5=i5;n8=i8;}}printf(*'Formaxinumprofit,heshouldsosavehismoneyinabank:\nH);printf("madefixeddepositfor8year:%dtimes\n"zn8);printf(*'madefixeddepositfor5year:%dtimes\n"zn5);printf(Hmadefixeddepositfor3year:%dtimes\n"zn3);printf("madefixeddepositfor2year:%dtimes\n"zn2);printf("madefixeddepositfor1year:%dtimes\n"znl);printf("Toal:%.2f\n"zmax);/?輸出存款方式*/}?運(yùn)行結(jié)果Formaxinumprofitzheshouldsosavehismoneyinabank:madefixeddepositfor8year:Otimesmadefixeddepositfor5year:4timesmadefixeddepositfor3year:Otimesmadefixeddepositfor2year:Otimesmadefixeddepositfor1year:OtimesTotal:8841.01可見最佳的存款方案為連續(xù)四次存5年期。.思考題某單位對職エ出售住房,每套為2萬元。買房付款的方法是:一次交清,優(yōu)惠20%從第一年開始,每年年初分期付款:5年交清,優(yōu)惠50%;10年交清,優(yōu)惠!0%;20年交清,沒有優(yōu)惠。現(xiàn)在有人手中正好有2萬元,若假定在今后20年中物價(jià)和銀行利率均保持不變,問他應(yīng)當(dāng)選擇哪種付款方式可以使應(yīng)付的錢最少?15.捕魚和分魚A、B、C、D,E五個(gè)人在某天夜里合伙去捕魚,到第二天凌晨時(shí)都疲憊不堪,于是各自找地方睡覺。日上三桿,A第一個(gè)醒來,他將魚分為五份,把多余的一條魚扔掉,拿走自己的ー份。B第二個(gè)醒來,也將魚分為五份,把多余的一條魚扔掉,保持走自己的ー份。C、D、E依次醒來,也按同樣的方法拿走魚。問他們合伙至少捕了多少條魚?問題分析與算法設(shè)計(jì)根據(jù)題意,總計(jì)將所有的魚進(jìn)行了五次平均分配,每次分配時(shí)的策略是相同的,即扔掉一條魚后剩下的魚正好分成五份,然后拿走自己的一份,余下其它的四份。假定魚的總數(shù)為X,則X可以按照題H的要求進(jìn)行五次分配:X-1后可被5整除,余下的魚為4*(X-1)、5。若X滿足上述要求,則X就是題目的解。程序說明與注釋#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=O;/?若不能分配則置標(biāo)記falg=O退出分配過程?/if(flag)break;/?若分配過程正常結(jié)束則找到結(jié)果退出試探的過程?/elseflag=l;/?否則繼續(xù)試探下ー個(gè)數(shù)?/}printf("Totalnumberoffishcatched=%d\n",n);/?輸出結(jié)果?/}運(yùn)行結(jié)果Totalnumberoffishcatched=3121問題的進(jìn)ー步討論程序采用試探法,試探的初值為6,毎次試探的步長為1。這是過分保守的做法。可以在進(jìn)ー步分析題目的基礎(chǔ)上修改此值,增大試探的步長值,以減少試探次數(shù)。思考題請使用其它的方法求解本題。6.出售金魚買賣提將養(yǎng)的ー缸金魚分五次出售系統(tǒng)ヒー次賣出全部的一半加二分之一條;第二次賣出余ド的三分之一ー加三分之一條;第三次賣出余下的四分之一加四分之一條;第四次賣出余下的五分之ー加五分之一條;最后賣出余下的11條。問原來的魚缸中共有幾條金魚??問題分析與算法設(shè)計(jì)題目中所有的魚是分五次出售的,每次賣出的策略相同;第j次賣剩下的(j+1)分之一再加l/(j+l)條。第五次將第四次余下的11條全賣了。假定第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;jv=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==ll)/?若第四次余下11條則滿足題意?/{printf("Thereare%dfishesatfirst.\n",i);/*輸出結(jié)果ッn=l;/?控制退出試探過程?/}}}?運(yùn)行結(jié)果Thereare59fishesatfirst.?思考題日本著名數(shù)學(xué)游戲?qū)<抑写辶x作教授提出這樣ー個(gè)問題:父親將2520個(gè)桔子分給六個(gè)兒子。分完后父親說:''老大將分給你的桔子的1/8給老二:老二拿到后連同原先的桔子分1/?給老三;老三拿到后連同原先的桔子分1/6給老四;老四拿到后連同原先的桔子分1/5給老五;老五拿到后連同原先的桔子分1/4給老六;老六拿到后連同原先的桔子分1/3給老大”。結(jié)果大家手中的桔子正好一樣多。問六兄弟原來手中各有多少桔子?7.平分七筐魚甲、乙、丙三位魚夫出海打魚,他們隨船帶了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;iv=3;i++)/?試探第一個(gè)人滿筐a[〇][〇]的值,滿筐數(shù)不能>3ツ{a[0][0]=i;for(j=i;jv=7-i&&jv=3;j++)/?試探第二個(gè)人滿筐a[l][〇]的值,滿筐數(shù)不能>3ツ<a[l][O]=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[O][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][l]==7)a[n][2]=7-a[n][0]-a[n][l];/?計(jì)算應(yīng)得到的空筐數(shù)量ッelseflag=O;/?不符合題意貝慣標(biāo)記為〇?/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][l],a[n][2]);}}}}}}?運(yùn)行結(jié)果Itexistspossibledistributionplans:No.lFullbasketSemi-basketEmptyfisherA:151fisherB:313fisherC:313No.2FullbasketSemi-basketEmptyfisherA:232fisherB:232fisherC:313?思考題晏會(huì)上數(shù)學(xué)家出了一道難題:假定桌子上有三瓶啤酒,癬瓶子中的酒分給幾個(gè)人喝,但喝各瓶酒的人數(shù)是不一樣的。不過其中有一個(gè)人喝了每ー瓶中的酒,且加起來剛好是ー瓶,請問喝這三瓶酒的各有多少人?(答案:喝三瓶酒的人數(shù)分別是2人、3人和6人)18.有限5位數(shù)個(gè)位數(shù)為6且能被3整除的五位數(shù)共有多少?題目分析與算法設(shè)計(jì)根據(jù)題意可知,滿足條件的五位數(shù)的選擇范圍是10006、10016〇〇〇99996.可設(shè)基礎(chǔ)數(shù)i=1000I通過計(jì)算i*10+6即可得到欲選的數(shù)(i的變化范圍是100〇?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ù)?/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)19.8除不盡的自然數(shù)ー個(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從。開始取值),用逆推法可以列出關(guān)系式:(((i*8+7)*8)+l)*8+l=((2*i*17)+15)*18+4再用試探法求出商i的值。程序說明與注釋#include<stdio.h>intmain(){inti;for(i=0;;i++)/?試探商的值?/if(((i*8+7)*8+l)*8+l==(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:199320.一個(gè)奇異的三位數(shù)ー個(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*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);)}運(yùn)行結(jié)果Thespecialnumberwith3digitsis:503(7)=305(9)=248(10)C/C++語言經(jīng)典、實(shí)用、趣味程序設(shè)計(jì)編程百例精解(3)位反序數(shù)設(shè)N是ー個(gè)四位數(shù),它的9倍恰好是其反序數(shù),求N。反序數(shù)就是將整數(shù)的數(shù)字倒過來形成的整數(shù)。例如:1234的反序數(shù)是4321。問題分析與算法設(shè)計(jì)可設(shè)整數(shù)N的千、百、十、個(gè)位為i、j、k、I,其取值均為〇?9,則滿足關(guān)系式:(i*103+j*102+10*k+l)*9=(l*103+k*102+10*j+i)的i、j、k、I即構(gòu)成N。程序說明與注釋#include<stdio.h>intmain()<inti;for(i=1002;ivllll;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);/?若是則輸出?/}運(yùn)行結(jié)果Thenumbersatisfiedstatesconditionis:108922.求車速ー輛以固定速度行駛的汽車,司機(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];/?數(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",a[0],a[l],a[2],a[3],a[4]);printf("Thevelocityofthecaris:%.2f\n",(i-95859)/2.0);break;)})運(yùn)行結(jié)果Thenewsymmetricalnumberkelometersis:95959.Thevelocityofthecaris:50.00思考題將一個(gè)數(shù)的數(shù)碼倒過來所得到的新數(shù)叫原數(shù)的反序數(shù)。如果ー個(gè)數(shù)等于它的反序數(shù),則稱它為對稱數(shù)。求不超過1993的最大的二進(jìn)制的對稱數(shù)。23.由兩個(gè)平方三位數(shù)獲得三個(gè)平方二位數(shù)已知兩個(gè)平方三位數(shù)abc和xyz,其中a、b、c、x、y,z未必是不同的;而ax、by、cz是三個(gè)平方二位數(shù)。請編程求三位數(shù)abc和xyz。問題分析與算法設(shè)計(jì)任取兩個(gè)平方三位數(shù)n和nl,將n從高向低分解為a、b、c,將n!從髙到低分解為x、y、z。判斷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=ll;iv=31;++i)〃窮舉平方三位數(shù)的取值范圍for(t=ll;t<=31;++t){f(i*i,a);〃分解平方三位數(shù)的各位,每位數(shù)字分別存入數(shù)組中f(t*t,b);if(sqrt(a[O]*lO+b[O])==(int)sqrt(a[0]*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ù)字的階乘之和。即abe=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ù)。問題分析與算法設(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];printf("TherearefoilwingArmstrongnumbersmallerthan1000:\n");for(i=2;ivl000;i++)/*窮舉要判定的數(shù)I的取值范圍2?100〇?/{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:153370371407.完全數(shù)如果ー個(gè)數(shù)恰好等于它的因子之和,則稱該數(shù)為、'完全數(shù)'問題分析與算法設(shè)計(jì)根據(jù)完全數(shù)的定義,先計(jì)算所選取的整數(shù)a(a的取值1?1000)的因子,將各因子累加于m,若m等于a,則可確認(rèn)a為完全數(shù)。程序說明與注釋#include<stdio.h>intmain(){inta,i,m;printf("Therearefollowingperfectnumberssmallerthan1000:\n");for(a=l;a<1000;a++)/?循環(huán)控制選取!~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");)運(yùn)行結(jié)果TTherearefollowingperfectnumberssmallerthan1000:628496.親密數(shù)如果整數(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;iv=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&&avb)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請求出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,ll,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*10;/*kk為截取部分積時(shí)的系數(shù)?/mul=0;/?積的最后n位ッ11=10;/*11為截取乘數(shù)相應(yīng)位時(shí)的系數(shù)?/while(k>0)mul=(mul+(number%(k*10))*(number%ll-number%(ll/10)))%kk;/*(部分積+截取被乘數(shù)的后N位*截取乘數(shù)的第M位),%kk再截取部分積?/k/=10;/*k為截取被乘數(shù)時(shí)的系數(shù)ッ11*=10;}if(number==mul)/?判斷若為自守?cái)?shù)則輸出?/printf("%ld",number);}?運(yùn)行結(jié)果Itexstsfollowingautomorphicnumbnerssmallerthan200000:0156257637662593769062510937628.回文數(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且!<=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;printf("No.numberit'ssquare(palindrome)\n");for(n=l;nv256;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)11122433941112152248462667671011020181111232191211464110202408041121244944〃下面程序是原來的,有錯(cuò),而且費(fèi)解#include<stdio.h>intmain(void){intm[16]znzi/t/count=0;longunsigneda,k;printf("No.numberit'ssquare(palindrome)\n");for(n=l;nv256;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[i]=a%10;〃安安注:這個(gè)是取得a的個(gè)位,整個(gè)循環(huán)合起來就可以取得各個(gè)位,并存于數(shù)組中,為了是下面判斷是不是對稱a/=10;}for(;i>l;i-)(k+=m[i-l]*t;t*=10;}if(k==n*n)printf("%2d%10d%10d\n",++countzn/n*n);}return0;}?運(yùn)行結(jié)果No.numberifssquare(palindrome)111224339411121522484626676710110201811112321912114641.求具有abcd=(ab+cd)2性質(zhì)的四位數(shù)3025這個(gè)數(shù)具有一種獨(dú)特的性質(zhì):將它平分為ニ段,即30和25,使之相加后求平方,即(30+25)2,恰好等于3025本身。請求出具有這樣性質(zhì)的全部四位數(shù)。問題分析與算法設(shè)計(jì)具有這種性質(zhì)的四位數(shù)沒有分布規(guī)律,可以采用窮舉法,対所有四位數(shù)進(jìn)行判斷,從而篩選出符合這種性質(zhì)的四位數(shù)。具體算法實(shí)現(xiàn),可任取ー個(gè)四位數(shù),將其截為兩部分,前兩位為a,后兩位為b,然后套用公式計(jì)算并判斷。程序說明與注釋#include<stdio.h>intmain(){intn,a,b;printf("Therearefollowingnumberwith4digitssatisfiedcondition\n");for(n=1000;n<10000;n++)/?四位數(shù)N的取值范圍100〇?9999*/<a=nハ00;/?截取N的前兩位數(shù)存于a*/b=n%100;/?截取N的后兩位存于b*/if((a+b)*(a+b)==n)/?判斷N是否為符合題目所規(guī)定的性質(zhì)的四位數(shù)?/printf("%d",n);}運(yùn)行結(jié)果Therearefollowingnumberswith4digitssatisfiedcondition:202530259801.求素?cái)?shù)求素?cái)?shù)表中1?1000之間的所有素?cái)?shù)?問題分析與算法設(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開始,到該整數(shù)n的1/2為止,用i依次去除需要判定的整數(shù),只要存在可以整除該數(shù)的情況,即可確定要判斷的整數(shù)不是素?cái)?shù),否則是素?cái)?shù)。?程序說明與注釋#include<stdio.h>intmain(){intnl,nm,i,j,flag,count=0;do{printf("InputSTARTandEND二?”);scanf("%d%d",&nl,&nm);/*輸入求素?cái)?shù)的范圍?/}while(!(nl>O&&nlvnm));/*輸入正確的范圍?/printf(" PRIMETABLE(%d-%d) \n",nl,nm);if(nl==l||nl==2)/?處理素?cái)?shù)2*/{printf("%4d",2);nl=3;count++;}for(i=nl;iv=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=O;/*若能整除則不是素?cái)?shù)ッif(flag)printf(++count%15?"%4d":"%4d\n"/i);})?思考題請找出十個(gè)最小的連續(xù)自然數(shù),它們個(gè)個(gè)都是合數(shù)(非素?cái)?shù))C/C++語言經(jīng)典、實(shí)用、趣味程序設(shè)計(jì)編程百例精解(4)31.歌德巴赫猜想驗(yàn)證:2000以內(nèi)的正偶數(shù)都能夠分解為兩個(gè)素?cái)?shù)之和(即驗(yàn)證歌德巴赫猜想對2000以內(nèi)的正偶數(shù)成立)。?問題分析與算法設(shè)計(jì)為了驗(yàn)證歌德巴赫猜想對2000以內(nèi)的正偶數(shù)都是成立的,要將整數(shù)分解為兩部分,然后判斷出分解出的兩個(gè)整數(shù)是否均為素?cái)?shù)。若是,則滿足題意;否則重新進(jìn)行分解和判斷。程序中對判斷是否為素?cái)?shù)的算法進(jìn)行了改進(jìn),對整數(shù)判斷“用從2開始到該整數(shù)的一半’’改為、、2開始到該整數(shù)的平方根"。原因何在請自行分析。?程序說明與注釋#include<stdio.h>#include<math.h>intfflag(intn);intmain(){inti,n;for(i=4;i<=2000;i+=2){for(n=2;nvi;n++)/?將偶數(shù)i分解為兩個(gè)整數(shù)ッif(fflag(n))/?分別判斷兩個(gè)整數(shù)是否均為素?cái)?shù)*/if(fflag(i-n)){printf("%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))retum0;return1;/*ifyes,return1*/)32.可逆素?cái)?shù)求四位的可逆素?cái)?shù)??赡嫠?cái)?shù)指:ー個(gè)素?cái)?shù)將其各位數(shù)字的順序倒過來構(gòu)成的反序數(shù)也是素?cái)?shù)。?問題分析與算法設(shè)計(jì)本題的重點(diǎn)不是判斷素?cái)?shù)的方法,而是求一個(gè)整數(shù)的反序數(shù)。求反序數(shù)的方法是從整數(shù)的末尾依次截取最后一位數(shù)字,每截取一次后整數(shù)縮小10倍,將截取的數(shù)字作為新的整數(shù)的最后一位(新的整數(shù)擴(kuò)大10倍后加上被截取的數(shù)字)。這樣原來的整數(shù)的數(shù)字從低到高被不斷地截取,依次作為新的整數(shù)從高到低的各位數(shù)字。?程序說明與注釋#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:%dn:"%3d:%d\n,,z++count/i);}return0;)intnum(intnumber){inti,j;if(!ok(number))return0;〃判斷是否為素?cái)?shù)for(i=number,j=0;i>0;i/=10)〃按位將整數(shù)倒過來,產(chǎn)生反序數(shù){j=j*10+i%10;}if(numbervj)〃若原數(shù)小于反序數(shù){if(!ok(i))〃判斷對應(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ù)則返回!,否則返回〇return0;return1;}?思考題求1000以內(nèi)的學(xué)生素?cái)?shù)。李生素?cái)?shù)是指:若a為素?cái)?shù),且a+2也是素?cái)?shù),則素?cái)?shù)a和a+2稱為李生素?cái)?shù)。33.回文素?cái)?shù)求不超過1000的回文素?cái)?shù)。問題分析與算法設(shè)計(jì)所謂回文素?cái)?shù)是指,對ー個(gè)整數(shù)n從左向右和從由向左讀其結(jié)果值相同且是素?cái)?shù),即稱n為回文素?cái)?shù)。所以木題的重點(diǎn)不是判斷素?cái)?shù)的方法,而是求回文整數(shù)。構(gòu)造回文數(shù)的方法很多,這里僅介紹ー種最簡單的算法。實(shí)現(xiàn)思路是先求出ー個(gè)整數(shù)的回文數(shù),再判斷是否為素?cái)?shù)。不超過1000的回文數(shù)包括二位和三位的回文數(shù),我們采用窮舉法來構(gòu)造ー個(gè)整數(shù)并求與其對應(yīng)的反序數(shù),若整數(shù)與其反序數(shù)相等,則該整數(shù)是回文數(shù)。程序說明與注釋#include<stdio.h>inta(intn)intmain(){inti,j,t,k,s;printf("Followingarepalindromeprimesnotgreaterthan1000:\n");for(i=0;iv=9;++i)〃窮舉第一位for(j=0;j<=9;++j)〃窮舉第二位for(k=0;kv=9;++k)〃窮舉第三位{s=i*100+j*10+k;〃計(jì)算組成的整數(shù)t=ik*100+j*10+i;〃計(jì)算對應(yīng)的反序數(shù)if(i==0&&j==0)〃處理整數(shù)的前兩位為〇的情況{t/100;}elseif(i==0)〃處理整數(shù)的第一位為〇的情況{t/10;}if(s.lO&&s==t&&a(s))〃若大于10且為回文素?cái)?shù),則輸出{printf("%d\t",s);})return0;)〃判斷參數(shù)n是否為素?cái)?shù)inta(intn){inti;for(i=2;i<(n-l)/2;+=i){if(n%i==0)return0;)return1;}運(yùn)行結(jié)果Followingarepalindromeprimesnotgreaterthan1000:11101131151181191313353373383727787797919929思考題優(yōu)化生成冋文數(shù)的算法。34.要發(fā)就發(fā)“1898ー要發(fā)就發(fā)"。請將不超過1993的所有素?cái)?shù)從小到大排成第一行,第二行上的每個(gè)素?cái)?shù)都等于它右肩上的素?cái)?shù)之差。編程求出:第二行數(shù)中是否存在這樣的若干個(gè)連續(xù)的整數(shù),它們的和恰好是1898?假好存在的話,又有幾種這樣的情況?第一行:2357111317197919871993第二行:12242486?問題分析與算法設(shè)計(jì)首先從數(shù)學(xué)上分析該問題:假設(shè)第一行中的素?cái)?shù)為n[l]、n[2
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 玩具買賣合同范本
- 庫存特價(jià)車合同模板
- 政策處理費(fèi)合同范例
- 拒收貨物買賣合同范例
- 居間合同范例 中介
- 中學(xué)房子出租合同范例
- 培訓(xùn)學(xué)校聘教師合同范例
- 天花機(jī)清洗合同范例
- 商店購房合同范例
- 房產(chǎn)經(jīng)紀(jì)服務(wù)合同范例
- 業(yè)務(wù)居間合同范本2024年
- 員工入股退股合同范例
- 2024年xx村10月駐村工作總結(jié)
- 手機(jī)游戲獨(dú)家代理協(xié)議模板
- 【浙江卷】浙江省2024學(xué)年第一學(xué)期杭州市2025屆高三年級(jí)教學(xué)質(zhì)量檢測(杭州一模)(11.4-11.6)英語試卷
- 小學(xué)語文深度教學(xué)心得體會(huì)范文(31篇)
- 2023年隴南康縣招聘專職社區(qū)工作者考試真題
- 2024年審計(jì)工作總結(jié)(六篇)
- JJG2063-液體流量計(jì)器具檢定系統(tǒng)表檢定規(guī)程
- 福建復(fù)旦大學(xué)附屬中山醫(yī)院廈門醫(yī)院招聘編外真題
- 化 學(xué)二氧化碳的實(shí)驗(yàn)室制取課件-2024-2025學(xué)年九年級(jí)化學(xué)人教版上冊
評(píng)論
0/150
提交評(píng)論