C程序經(jīng)典算法例題_第1頁
C程序經(jīng)典算法例題_第2頁
C程序經(jīng)典算法例題_第3頁
C程序經(jīng)典算法例題_第4頁
C程序經(jīng)典算法例題_第5頁
已閱讀5頁,還剩64頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 繪制余弦曲線在屏幕上用“*顯示0360度的余弦函數(shù)cos(x)曲線。關鍵在于余弦曲線在0360度的區(qū)間內,一行中要顯示兩個點,而對一般的顯示器來說,只能按行輸出,即:輸出第一行信息后,只能向下一行輸出,不能再返回到上一行。問題分析與算法設計如果在程序中使用數(shù)組,這個問題十分簡單。但假設規(guī)定不能使用數(shù)組,問題就變得不容易了。關鍵在于余弦曲線在0360度的區(qū)間內,一行中要顯示兩個點,而對一般的顯示器來說,只能按行輸出,即:輸出第一行信息后,只能向下一行輸出,不能再返回到上一行。為了獲得本文要求的圖形就必須在一行中一次輸出兩個“*。為了同時得到余弦函數(shù)cos(x)圖形在一行上的兩個點,考慮利用co

2、s(x)的左右對稱性。將屏幕的行方向定義為x,列方向定義為y,那么0180度的圖形與180360度的圖形是左右對稱的,假設定義圖形的總寬度為62列,計算出x行0180度時y點的坐標m,那么在同一行與之對稱的180360度的y點的坐標就 應為62-m。程序中利用反余弦函數(shù)acos計算坐標(x,y)的對應關系。使用這種方法編出的程序短小精煉,表達了一定的技巧。#include#include#includeint main()double y;int x,m;for(y=1;y=-1;y-=0.1) /*y為列方向,值從1到-1,步長為0.1*/m=acos(y)*10; /*計算出y對應的弧度m

3、,乘以10為圖形放大倍數(shù)*/for(x=1;xm;x+) printf( );printf(*); /*控制打印左側的 * 號*/for(;x62-m;x+)printf( );printf(*n); /*控制打印同一行中對稱的右側*號*/ system(pause);return 0; 繪制余弦曲線和直線在屏幕上顯示0360度的cos(x)曲線與直線f(x)=45*(y-1)+31的迭加圖形。其中cos(x)圖形用“*表示,f(x)用“+表示,在兩個圖形相交的點上那么用f(x)圖形的符號。 圖形迭加的關鍵是要在分別計算出同一行中兩個圖形的列方向點坐標后,正確判斷相互的位置關系。問題分析與算法

4、設計此題可以在上題的根底上進行修改。圖形迭加的關鍵是要在分別計算出同一行中兩個圖形的列方向點坐標后,正確判斷相互的位置關系。為此,可以先判斷圖形的交點,再分別控制打印兩個不同的圖形。#include#include #includeint main()double y;int x,m,n,yy;for(yy=0;yy=20;yy+) /*對于第一個y坐標進行計算并在一行中打印圖形*/y=0.1*yy; /*y:屏幕行方向坐標*/m=acos(1-y)*10; /*m: cos(x)曲線上y點對應的屏幕列坐標*/n=45*(y-1)+31; /*n: 直線上y點對應的列坐標*/for(x=0;x

5、=62;x+) /*x: 屏幕列方向坐標*/if(x=m&x=n) printf(+); /*直線與cos(x)相交時打印“+*/else if(x=n) printf(+); /*打印不相交時的直線圖形*/else if(x=m|x=62-m) printf(*); /*打印不相交時的cos(x)圖形*/else printf( ); /*其它情況打印空格*/printf(n); system(pause);return 0; 繪制圓在屏幕上用“*畫一個空心的圓 *問題分析與算法設計:打印圓可利用圖形的左右對稱性。根據(jù)圓的方程:R*R=X*X+Y*Y 可以算出圓上每一點行和列的對應關系。*思

6、考題:實現(xiàn)函數(shù)y=x2的圖形與圓的圖形疊加顯示*問題分析與算法設計打印圓可利用圖形的左右對稱性。根據(jù)圓的方程:R*R=X*X+Y*Y可以算出圓上每一點行和列的對應關系。#include#include#include int main()double y;int x,m;for(y=10;y=-10;y-)行距大于列距,不進行調節(jié)顯示出來的將是橢圓*/for(x=1;x30-m;x+) printf( ); /*圖形左側空白控制*/printf(*); /*圓的左側*/for(;x30+m;x+) printf( ); /*圖形的空心局部控制*/printf(*n); /*圓的右側*/ sys

7、tem(pause);return 0; 歌星大獎賽在歌星大獎賽中,有10個評委為參賽的選手打分,分數(shù)為1100分。選手最后得分為:去掉一個最高分和一個最低分后其余8個分數(shù)的平均值。請編寫一個程序實現(xiàn)。題目條件不變,但考慮同時對評委評分進行裁判,即在10個評委中找出最公平和最不公平*問題分析與算法設計這個問題的算法十分簡單,但是要注意在程序中判斷最大、最小值的變量是如何賦值的。*程序說明與注釋#include#includeint main()int integer,i,max,min,sum;max=-32768; /*先假設當前的最大值max為C語言整型數(shù)的最小值*/min=32767;

8、/*先假設當前的最小值min為C語言整型數(shù)的最大值*/sum=0; /*將求累加和變量的初值置為0*/for(i=1;imax)max=integer; /*通過比擬篩選出其中的最高分*/if(integermin)min=integer; /*通過比擬篩選出其中的最低分*/printf(Canceled max score:%dnCanceled min score:%dn,max,min);printf(Average score:%dn,(sum-max-min)/8); /*輸出結果*/system(pause); 求最大數(shù)問555555的約數(shù)中最大的三位數(shù)是多少?根據(jù)約數(shù)的定義,對于

9、一個整數(shù)N,除去1和它自身外,凡能整除N的數(shù)即為N的約數(shù)。因此,最簡單的方法是用2到N-1之間的所有數(shù)去除N,即可求出N的全部約數(shù)。此題只要求取約數(shù)中最大的三位數(shù),那么其取值范圍可限制在100到999之間。*問題分析與算法設計根據(jù)約數(shù)的定義,對于一個整數(shù)N,除去1和它自身外,凡能整除N的數(shù)即為N的約數(shù)。因此,最簡單的方法是用2到N-1之間的所有數(shù)去除N,即可求出N的全部約數(shù)。此題只要求取約數(shù)中最大的三位數(shù),那么其取值范圍可限制在100到999之間。*程序說明與注釋#include#include int main()long i;int j;printf(Please input number

10、:);scanf(%ld,&i);for(j=999;j=100;j-)if(i%j=0)printf(The max factor with 3 digits in %ld is:%d,n,i,j);break;system(pause); 運行結果輸入:555555輸出:The max factor with 3 digits in 555555 is:777 高次方的尾數(shù)求13的13次方的最后三位數(shù)?解此題最直接的方法是:將13累乘13次方截取最后三位即可。但是由于計算機所能表示的整數(shù)范圍有限,用這種“正確的算法不可能得到正確的結果。事實上,題目僅要求最后三位的值,完全沒有必要求13的1

11、3次方的完整結果。求13的13次方的最后三位數(shù)問題分析與算法設計解此題最直接的方法是:將13累乘13次方截取最后三位即可。但是由于計算機所能表示的整數(shù)范圍有限,用這種“正確的算法不可能得到正確的結果。事實上,題目僅要求最后三位的值,完全沒有必要求13的13次方的完整結果。研究乘法的規(guī)律發(fā)現(xiàn):乘積的最后三位的值只與乘數(shù)和被乘數(shù)的后三位有關,與乘數(shù)和被乘數(shù)的高位無關。利用這一規(guī)律,可以大大簡化程序。#include#include int main()int i,x,y,last=1; /*變量last保存求X的Y次方過程中的局部乘積的后三位*/printf(Input X and Y(X*Y):

12、);scanf(%d*%d,&x,&y);for(i=1;i=y;i+) /*X自乘Y次*/last=last*x%1000; /*將last乘X后對1000取模,即求積的后三位*/printf(The last 3 digits of %d*%d is:%dn,x,y,last%1000); /*打印結果*/system(pause);運行結果Input X and Y(X*Y):13*13The last 3 digits of 13*13 is:253Input X and Y(X*Y):13*20The last 3 digits of 13*20 is:801 HYPERLINK :

13、/ kuqin /tiku/20210424/7530.html l # 階乘尾數(shù)零的個數(shù) 100!的尾數(shù)有多少個零? 為了解決這個問題,必須首先從數(shù)學上分析在100!結果值的末尾產(chǎn)生零的條件。不難看出:一個整數(shù)假設含有一個因子5,那么必然會在求100!時產(chǎn)生一個零。因此問題轉化為求1到100這100個整數(shù)中包含了多少個因子5。*問題分析與算法設計可以設想:先求出100!的值,然后數(shù)一下末尾有多少個零。事實上,與上題一樣,由于計算機所能表示的整數(shù)范圍有限,這是不可能的。 為了解決這個問題,必須首先從數(shù)學上分析在100!結果值的末尾產(chǎn)生零的條件。不難看出:一個整數(shù)假設含有一個因子5,那么必然會在

14、求100!時產(chǎn)生一個零。因此問題轉化為求1到100這100個整數(shù)中包含了多少個因子5。假設整數(shù)N能被25整除,那么N包含2個因子5;假設整數(shù)N能被5整除,那么N包含1個因子5。*程序說明與注釋#include#includeint main()int a,count =0;for(a=5;a=100;a+=5) /循環(huán)從5開始,以5的倍數(shù)為步長,考察整數(shù)+count; /假設為5的倍數(shù),計數(shù)器加1if(!(a%25) +count; /假設為25的倍數(shù),計數(shù)器再加1printf(The number of 0 in the end of 100! is: %d.n,count); /打印結果s

15、ystem(pause);return 0; 運行結果The number of 0 in the end of 100! is: 24. HYPERLINK :/ kuqin /tiku/20210424/7531.html l # 借書方案知多少 小明有五本新書,要借給A,B,C三位小朋友,假設每人每次只能借一本,那么可以有多少種不同的借法?本問題實際上是一個排列問題,即求從5個中取3個進行排列的方法的總數(shù)。首先對五本書從1至5進行編號,然后使用窮舉的方法。*問題分析與算法設計本問題實際上是一個排列問題,即求從5個中取3個進行排列的方法的總數(shù)。首先對五本書從1至5進行編號,然后使用窮舉的方

16、法。假設三個人分別借這五本書中的一本,當三個人所借的書的編號都不相同時,就是滿足題意的一種借閱方法。#include#includeint main()int a,b,c,count=0;printf(There are diffrent methods for XM to distribute books to 3 readers:n);for(a=1;a=5;a+) /*窮舉第一個人借5本書中的1本的全部情況*/for(b=1;b=5;b+) /*窮舉第二個人借5本書中的一本的全部情況*/for(c=1;a!=b&c=2)當J=1或J=N+1時:其值為1J!=1且J!=N+1時:其值為第N

17、-1行的第J-1個值與第N-1行第J個值之和#include#includeusing namespace std;#define N 10 int main()int aNN=0;int i,j;for(i=0;iN;i+)for(j=0;j0&ji)aij=ai-1j-1+ai-1j;else if(i=j)aij=1;for(i=0;iN;i+) for(j=0;j=i;j+)coutsetw(4)aij;if(i=j)coutn;system(“pause);return 0; 打漁還是曬網(wǎng)中國有句俗語叫“三天打魚兩天曬網(wǎng)。某人從1990年1月1日起開始“三天打魚兩天曬網(wǎng),問這個人在以

18、后的某一天中是“打魚還是“曬網(wǎng)。根據(jù)題意可以將解題過程分為三步:1)計算從1990年1月1日開始至指定日期共有多少天中國有句俗語叫“三天打魚兩天曬網(wǎng)。某人從1990年1月1日起開始“三天打魚兩天曬網(wǎng),問這個人在以后的某一天中是“打魚還是“曬網(wǎng)。問題分析與算法設計根據(jù)題意可以將解題過程分為三步:1)計算從1990年1月1日開始至指定日期共有多少天;2)由于“打魚和“曬網(wǎng)的周期為5天,所以將計算出的天數(shù)用5去除;3)根據(jù)余數(shù)判斷他是在“打魚還是在“曬網(wǎng);假設 余數(shù)為1,2,3,那么他是在“打魚否那么 是在“曬網(wǎng)在這三步中,關鍵是第一步。求從1990年1月1日至指定日期有多少天,要判斷經(jīng)歷年份中是否

19、有閏年,二月為29天,平年為28天。閏年的方法可以用偽語句描述如下:如果 (年能被4除盡 且 不能被100除盡)或 能被400除盡)那么 該年是閏年;否那么 不是閏年。C語言中判斷能否整除可以使用求余運算(即求模)#include#includeint days(struct date day);struct dateint year;int month;int day;int days(struct date day)static int day_tab213=0,31,28,31,30,31,30,31,31,30,31,30,31, /*平均每月的天數(shù)*/0,31,29,31,30,31

20、,30,31,31,30,31,30,31,;int i,lp;lp=day.year%4=0&day.year%100!=0|day.year%400=0;/*判定year為閏年還是平年,lp=0為平年,非0為閏年*/for(i=1;iday.month;i+) /*計算本年中自1月1日起的天數(shù)*/day.day+=day_tablpi;return day.day;int main()struct date today,term;int yearday,year,day;printf(Enter year/month/day:);scanf(%d%d%d,&today.year,&toda

21、y.month,&today.day); /*輸入日期*/term.month=12; /*設置變量的初始值:月*/term.day=31; /*設置變量的初始值:日*/for(yearday=0,year=1990;year0&day4) printf(he was fishing at that day.n); /*打印結果*/else printf(He was sleeping at that day.n);system(pause);運行結果Enter year/month/day:1991 10 25He was fishing at day.Enter year/month/da

22、y:1992 10 25He was sleeping at day.Enter year/month/day:1993 10 25He was sleeping at day 熱抓交通肇事犯一輛卡車違反交通規(guī)那么,撞人后逃跑。現(xiàn)場有三人目擊事件,但都沒有記住車號,只記下車號的一些特征。甲說:牌照的前兩位數(shù)字是相同的;乙說:牌照的后兩位數(shù)字是相同的,但與前兩位不同; 丙是數(shù)學家,他說:四位的車號剛好是一個整數(shù)的平方。請根據(jù)以上線索求出車號。一輛卡車違反交通規(guī)那么,撞人后逃跑?,F(xiàn)場有三人目擊事件,但都沒有記住車號,只記下車號的一些特征。甲說:牌照的前兩位數(shù)字是相同的;乙說:牌照的后兩位數(shù)字是相同

23、的,但與前兩位不同; 丙是數(shù)學家,他說:四位的車號剛好是一個整數(shù)的平方。請根據(jù)以上線索求出車號。問題分析與算法設計按照題目的要求造出一個前兩位數(shù)相同、后兩位數(shù)相同且相互間又不同的整數(shù),然后判斷該整數(shù)是否是另一個整數(shù)的平方。#include#include#include int main()int i,j,k,c;for(i=1;i=9;i+) /*i:車號前二位的取值*/for(j=0;j=9;j+) /*j:車號后二位的取值*/if(i!=j) /*判斷二位數(shù)字是否相異*/k=i*1000+i*100+j*10+j; /*計算出可能的整數(shù)*/for(c=31;c*ck;c+); /*判斷該

24、數(shù)是否為另一整數(shù)的平方*/if(c*c=k) printf(Lorry-No. is %d.n,k); /*假設是,打印結果*/system(pause);運行結果Lorry _No.is 7744該存多少錢假設銀行一年整存零取的月息為0.63%?,F(xiàn)在某人手中有一筆錢,打算在今后的五年中的年底取出1000元,到第五年時剛好取完,請算出他存錢時應存入多少。分析存錢和取錢的過程,可采用倒推的方法。假設第五年年底連本帶息要取1000元,那么要先求出第五年年初銀行存款的錢數(shù)假設銀行一年整存零取的月息為0.63%?,F(xiàn)在某人手中有一筆錢,他打算在今后的五年中的年底取出1000元,到第五年時剛好取完,請算出

25、他存錢時應存入多少。問題分析與算法設計分析存錢和取錢的過程,可以采用倒推的方法。假設第五年年底連本帶息要取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)通過以上過程就可以很容易地求出第一年年初要存入多少錢

26、。#include#includeint main()int i;float total=0;for(i=0;i5;i+) /*i 為年數(shù),取值為04年*/total=(total+1000)/(1+0.0063*12); /*累計算出年初存款數(shù)額,第五次的計算結果即為題解*/printf(He must save %.2f at first.n,total);system(pause); 怎樣存錢利最大 某人手中有2000元錢,通過計算選擇一種存錢方案,使得錢存入銀行20年后得到的利息最多(假定銀行對超過存款期限的那一局部時間不付利息)。為了得到最多的利息,存入銀行的錢應在到期時馬上取出來,

27、然后立刻將原來的本金和利息加起來再作為新的本金存入銀行假設銀行整存整取存款不同期限的月息利率分別為:0.63% 期限=1年0.66% 期限=2年0.69% 期限=3年0.75% 期限=5年0.84% 期限=8年利息=本金*月息利率*12*存款年限。現(xiàn)在某人手中有2000元錢,請通過計算選擇一種存錢方案,使得錢存入銀行20年后得到的利息最多(假定銀行對超過存款期限的那一局部時間不付利息)。問題分析與算法設計為了得到最多的利息,存入銀行的錢應在到期時馬上取出來,然后立刻將原來的本金和利息加起來再作為新的本金存入銀行,這樣不斷地滾動直到滿20年為止,由于存款的利率不同,所以不同的存款方法(年限)存2

28、0年得到的利息是不一樣的。分析題意,設2000元存20年,其中1年存i1次,2年存i2次,3年存i3次,5年存i5次,8年存i8次,那么到期時存款人應得到的本利合計為:2000*(1+rate1)i1*(1+rate2)i2*(1+rate3)i3*(1+rate5)i5*(1+rate8)i8其中rateN為對應存款年限的利率。根據(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=i1=20-8*i8-5*i5-3*i3-2*i2可以用窮舉法窮舉所有的i8、i5、i3、i2和

29、i1的組合,代入求本利的公式計算出最大值,就是最正確存款方案。#include#include#includeint main()int i8,i5,i3,i2,i1,n8,n5,n3,n2,n1;float max=0,term;for(i8=0;i83;i8+) /*窮舉所有可能的存款方式*/for(i5=0;i5=(20-8*i8)/5;i5+)for(i3=0;i3=(20-8*i8-5*i5)/3;i3+)for(i2=0;i2max)max=term;n1=i1;n2=i2;n3=i3;n5=i5;n8=i8;printf(For maxinum profit,he should

30、so save his money in a bank:n);printf( made fixed deposit for 8 year: %d timesn,n8);printf( made fixed deposit for 5 year: %d timesn,n5);printf( made fixed deposit for 3 year: %d timesn,n3);printf( made fixed deposit for 2 year: %d timesn,n2);printf( made fixed deposit for 1 year: %d timesn,n1);prin

31、tf( Toal: %.2fn,max);/*輸出存款方式*/system(pause); 運行結果For maxinum profit,he should so save his money in a bank:made fixed deposit for 8 year: 0timesmade fixed deposit for 5 year: 4timesmade fixed deposit for 3 year: 0timesmade fixed deposit for 2 year: 0timesmade fixed deposit for 1 year: 0timesTotal:88

32、41.01可見最正確的存款方案為連續(xù)四次存5年期。 抓魚和分魚 A、B、C、D、E五個人在某天夜里合伙去捕魚,到第二天凌晨時都疲憊不堪,于是各自找地方睡覺。日上三桿,A第一個醒來,他將魚分為五份,把多余的一條魚扔掉,拿走自己的一份。B第二個醒來,也將魚分為五份,把多余的一條魚扔掉,保持走自己的一份。 A、B、C、D、E五個人在某天夜里合伙去捕魚,到第二天凌晨時都疲憊不堪,于是各自找地方睡覺。日上三桿,A第一個醒來,他將魚分為五份,把多余的一條魚扔掉,拿走自己的一份。B第二個醒來,也將魚分為五份,把多余的一條魚扔掉,保持走自己的一份。C、D、E依次醒來,也按同樣的方法拿走魚。問他們合伙至少捕了多

33、少條魚? 問題分析與算法設計根據(jù)題意,總計將所有的魚進行了五次平均分配,每次分配時的策略是相同的,即扔掉一條魚后剩下的魚正好分成五份,然后拿走自己的一份,余下其它的四份。假定魚的總數(shù)為X,那么X可以按照題目的要求進行五次分配:X-1后可被5整除,余下的魚為4*(X-1)、5。假設X滿足上述要求,那么X就是題目的解。#include#includeint main()int n,i,x,flag=1; /*flag:控制標記*/for(n=6;flag;n+) /*采用試探的方法。令試探值n逐步加大*/for(x=n,i=1&flag;i=5;i+)if(x-1)%5=0) x=4*(x-1)/

34、5;else flag=0; /*假設不能分配那么置標記falg=0退出分配過程*/if(flag) break; /*假設分配過程正常結束那么找到結果退出試探的過程*/else flag=1; /*否那么繼續(xù)試探下一個數(shù)*/printf(Total number of fish catched=%dn,n); /*輸出結果*/system(pause);運行結果Total number of fish catched = 3121 出售金魚買賣提將養(yǎng)的一缸金魚分五次出售系統(tǒng)上一次賣出全部的一半加二分之一條;第二次賣出余下的三分之一加三分之一條;第三次賣出余下的四分之一加四分之一條;第四次賣出

35、余下的五分之一加五分之一條;最后賣出余下的11條。問原來的魚缸中共有幾條金魚?買賣提將養(yǎng)的一缸金魚分五次出售系統(tǒng)上一次賣出全部的一半加二分之一條;第二次賣出余下的三分之一加三分之一條;第三次賣出余下的四分之一加四分之一條;第四次賣出余下的五分之一加五分之一條;最后賣出余下的11條。問原來的魚缸中共有幾條金魚?問題分析與算法設計題目中所有的魚是分五次出售的,每次賣出的策略相同;第j次賣剩下的(j+1)分之一再加1/(j+1)條。第五次將第四次余下的11條全賣了。假定第j次魚的總數(shù)為X,那么第j次留下:x-(x+1)/(j+1)當?shù)谒拇纬鍪弁戤厱r,應該剩下11條。假設X滿足上述要求,那么X就是題目

36、的解。應當注意的是:(x+1)/(j+1)應滿足整除條件。試探X的初值可以從23開始,試探的步長為2,因為X的值一定為奇數(shù)。#include#includeint main()int i,j,n=0,x; /*n為標志變量*/for(i=23;n=0;i+=2) /*控制試探的步長和過程*/for(j=1,x=i;j=11;j+) /*完成出售四次的操作*/if(x+1)%(j+1)=0) /*假設滿足整除條件那么進行實際的出售操作*/x-=(x+1)/(j+1);else x=0;break; /*否那么停止計算過程*/if(j=5&x=11) /*假設第四次余下11條那么滿足題意*/pri

37、ntf(There are %d fishes at first.n,i); /*輸出結果*/n=1; /*控制退出試探過程*/system(pause);運行結果There are 59 fishes at first 平分七筐魚甲、乙、丙三位魚夫出海打魚,他們隨船帶了21只籮筐。當晚返航時,他們發(fā)現(xiàn)有七筐裝滿了魚,還有七筐裝了半筐魚,另外七筐那么是空的,由于他們沒有秤,只好通過目測認為七個滿筐魚的重量是相等的,7個半筐魚的重量是相等的。在不將魚倒出來的前提下,怎樣將魚和筐平分甲、乙、丙三位魚夫出海打魚,他們隨船帶了21只籮筐。當晚返航時,他們發(fā)現(xiàn)有七筐裝滿了魚,還有七筐裝了半筐魚,另外七筐

38、那么是空的,由于他們沒有秤,只好通過目測認為七個滿筐魚的重量是相等的,7個半筐魚的重量是相等的。在不將魚倒出來的前提下,怎樣將魚和筐平分為三份?問題分析與算法設計根據(jù)題意可以知道:每個人應分得七個籮筐,其中有3.5筐魚。采用一個3*3的數(shù)組a來表示三個人分到的東西。其中每個人對應數(shù)組a的一行,數(shù)組的第0列放分到的魚的整筐數(shù),數(shù)組的第1列放分到的半筐數(shù),數(shù)組的第2列放分到的空筐數(shù)。由題目可以推出:。數(shù)組的每行或每列的元素之和都為7;。對數(shù)組的行來說,滿筐數(shù)加半筐數(shù)=3.5;。每個人所得的滿筐數(shù)不能超過3筐;。每個人都必須至少有1 個半筐,且半筐數(shù)一定為奇數(shù)對于找到的某種分魚方案,三個人誰拿哪一份

39、都是相同的,為了防止出現(xiàn)重復的分配方案,可以規(guī)定:第二個人的滿筐數(shù)等于第一個人的滿筐數(shù);第二個人的半筐數(shù)大于等于第一個人的半筐數(shù)。#include#include int a33,count;int main()int i,j,k,m,n,flag;printf(It exists possible distribtion plans:n);for(i=0;i3*/a00=i;for(j=i;j=7-i&j3*/a10=j;if(a20=7-j-a00)3)continue; /*第三個人滿筐數(shù)不能3*/if(a20=前一個人,以排除重復情況*/for(k=1;k=5;k+=2) /*試探半筐

40、a01的值,半筐數(shù)為奇數(shù)*/a01=k;for(m=1;m7-k;m+=2) /*試探 半筐a11的值,半筐數(shù)為奇數(shù)*/a11=m;a21=7-k-m;for(flag=1,n=0;flag&n3;n+)/*判斷每個人分到的魚是 3.5筐,flag為滿足題意的標記變量*/if(an0+an17&an0*2+an1=7)an2=7-an0-an1; /*計算應得到的空筐數(shù)量*/else flag=0; /*不符合題意那么置標記為0*/if(flag)printf(No.%d Full basket Semi-basket Emptyn,+count);for(n=0;n3;n+)printf(

41、fisher %c: %d %d %dn,A+n,an0,an1,an2);system(pause);運行結果 It exists possible distribution plans:No.1 Full basket Semi-basket Emptyfisher A: 1 5 1fisher B: 3 1 3fisher C: 3 1 3No.2 Full basket Semi-basket Emptyfisher A: 2 3 2fisher B: 2 3 2fisher C: 3 1 3 有限五位數(shù)個位數(shù)為6且能被3整除的五位數(shù)共有多少?根據(jù)題意可知,滿足條件的五位數(shù)的選擇范圍是

42、10006、10016。99996??稍O根底數(shù)i=1000,通過計算i*10+6即可得到欲選的數(shù)(i的變化范圍是1000999),再判斷該數(shù)能否被3整除。個位數(shù)為6且能被3整除的五位數(shù)共有多少?題目分析與算法設計根據(jù)題意可知,滿足條件的五位數(shù)的選擇范圍是10006、10016。99996??稍O根底數(shù)i=1000,通過計算i*10+6即可得到欲選的數(shù)(i的變化范圍是1000999),再判斷該數(shù)能否被3整除#include#include int main()long int i;int count=0; /*count:統(tǒng)計滿足條件的五位數(shù)的個數(shù)*/for(i=1000;i=9999;i+)if

43、(!(i*10+6)%3) /*判斷所選的數(shù)能否被3整除*/count+; /*假設滿足條件那么計數(shù)*/printf(count=%dn,count);system(pause);運行結果count=3000 除不盡的自然數(shù)一個自然數(shù)被8除余1,所得的商被8除也余1,再將第二次的商被8除后余7,最后得到一個商為a。又知這個自然數(shù)被17除余4,所得的商被17除余15,最后得到一個商是a的2倍。求這個自然數(shù)。根據(jù)題意,可設最后的商為i(i從0開始取值),用逆推法可以列出關系式一個自然數(shù)被8除余1,所得的商被8除也余1,再將第二次的商被8除后余7,最后得到一個商為a。又知這個自然數(shù)被17除余4,所得

44、的商被17除余15,最后得到一個商是a的2倍。求這個自然數(shù)問題分析與算法設計根據(jù)題意,可設最后的商為i(i從0開始取值),用逆推法可以列出關系式:(i*8+7)*8)+1)*8+1=(2*i*17)+15)*18+4再用試探法求出商i的值。#include#include int main()int i;for(i=0;i+) /*試探商的值*/if(i*8+7)*8+1)*8+1=(34*i+15)*17+4) /*逆推判斷所取得的當前i值是否滿足關系式*/*假設滿足那么輸出結果*/printf(The required number is: %dn,(34*i+15)*17+4);brea

45、k; /*退出循環(huán)*/system(pause);運行結果The required number is:1993 一個奇異的三位數(shù)一個自然數(shù)的七進制表達式是一個三位數(shù),而這個自然數(shù)的九進制表示也是一個三位數(shù),且這兩個三位數(shù)的數(shù)碼正好相反,求這個三位數(shù)。根據(jù)題意可知,七進制和九進制表示的這全自然數(shù)的每一位一定小于7,可設其七進制數(shù)形式為kji,然后設其九進制表示形式為ijk。一個自然數(shù)的七進制表達式是一個三位數(shù),而這個自然數(shù)的九進制表示也是一個三位數(shù),且這兩個三位數(shù)的數(shù)碼正好相反,求這個三位數(shù)。問題分析與算法設計根據(jù)題意可知,七進制和九進制表示的這全自然數(shù)的每一位一定小于7,可設其七進制數(shù)形式為

46、kji(i、j、k的取值分別為16),然后設其九進制表示形式為ijk。#include#include int main()int i,j,k;for(i=1;i7;i+)for(j=0;j7;j+)for(k=1;k7;k+)if(i*9*9+j*9+k=i+j*7+k*7*7)printf(The special number with 3 digits is:);printf(%d%d%d(7)=%d%d%d(9)=%d(10)n,k,j,i,i,j,k,i*9*9+j*9+k);system(pause);運行結果The special number with 3 digits is:

47、503(7)=305(9)=248(10) 4位反序數(shù)設N是一個四位數(shù),它的9倍恰好是其反序數(shù),求N。反序數(shù)就是將整數(shù)的數(shù)字倒過來形成的整數(shù)??稍O整數(shù)N的千、百、十、個位為i、j、k、l,其取值均為09,那么滿足關系式(i*103+j*102+10*k+l)*9=(l*103+k*102+10*j+i) 的i、j、k、l即構成N。設N是一個四位數(shù),它的9倍恰好是其反序數(shù),求N。反序數(shù)就是將整數(shù)的數(shù)字倒過來形成的整問題分析與算法設計可設整數(shù)N的千、百、十、個位為i、j、k、l,其取值均為09,那么滿足關系式:(i*103+j*102+10*k+l)*9=(l*103+k*102+10*j+i)的

48、i、j、k、l即構成N。數(shù)。例如:1234的反序數(shù)是4321。#include#include int main()int i;for(i=1002;i1111;i+) /*窮舉四位數(shù)可能的值*/if(i%10*1000+i/10%10*100+i/100%10*10+i/1000=i*9)/*判斷反序數(shù)是否是原整數(shù)的9倍*/printf(The number satisfied stats condition is: %dn,i);/*假設是那么輸出*/system(pause);運行結果The number satisfied states condition is:1089 求車速一輛以

49、固定速度行駛的汽車,司機在上午10點看到里程表上的讀數(shù)是一個對稱數(shù)(如果一個數(shù)等于它的反序數(shù),那么稱它為對稱數(shù)。即這個數(shù)從左向右讀和從右向左讀是完全一樣的),為95859。兩小時后里程表上出現(xiàn)了一個新的對稱數(shù)。問該車的速度是多少?新對稱數(shù)是多少?一輛以固定速度行駛的汽車,司機在上午10點看到里程表上的讀數(shù)是一個對稱數(shù)(即這個數(shù)從左向右讀和從右向左讀是完全一樣的),為95859。兩小時后里程表上出現(xiàn)了一個新的對稱數(shù)。問該車的速度是多少?新的對稱數(shù)是多少?問題分析與算法設計根據(jù)題意,設所求對稱數(shù)為i,其初值為95589,對其依次遞增取值,將i值的每一位分解后與其對稱位置上的數(shù)進行比擬,假設每個對稱

50、位置上的數(shù)皆相等,那么可判定i即為所求的對稱數(shù)。#include#include int main()int t,a5; /*數(shù)組a存放分解的數(shù)字位*/long int k,i;for(i=95860;i+) /*以95860為初值,循環(huán)試探*/for(t=0,k=100000;k=10;t+) /*從高到低分解所取i值的每位數(shù)*/ /* 字,依次存放于a0a5中*/at=(i%k)/(k/10); k/=10;if(a0=a4)&(a1=a3)printf(The new symmetrical number kelometers is:%d%d%d%d%dn,a0,a1,a2,a3,a4)

51、;printf(The velocity of the car is: %.2fn,(i-95859)/2.0);break;system(pause);運行結果 HYPERLINK :/ kuqin /tiku/20210424/7546.html l # 由兩個平方三位數(shù)獲得三個平方二位數(shù)兩個平方三位數(shù)abc和xyz,其中a、b、c、x、y、z未必是不同的;而ax、by、cz是三個平方二位數(shù)。請編程求三位數(shù)abc和xyz。任取兩個平方三位數(shù)n和n1,將n從高向低分解為a、b、c,將n1從高到低分解為x、y、z。判斷ax、by、cz是否均為完全平方數(shù)。兩個平方三位數(shù)abc和xyz,其中a、b

52、、c、x、y、z未必是不同的;而ax、by、cz是三個平方二位數(shù)。請編程求三位數(shù)abc和xyz。問題分析與算法設計任取兩個平方三位數(shù)n和n1,將n從高向低分解為a、b、c,將n1從高到低分解為x、y、z。判斷ax、by、cz是否均為完全平方數(shù)。#include#include#includevoid f(int n,float* s);int main()int i,t;float a3,b3;printf(The possible perfect squares combinations are:n);for(i=11;i=31;+i) /窮舉平方三位數(shù)的取值范圍for(t=11;t=10;

53、+s)*s = (n%k) /(k/10);k /=10; HYPERLINK :/ kuqin /tiku/20210424/7547.html l # 阿姆斯特朗數(shù) 一個正整數(shù)等于其各個數(shù)字的立方和,那么稱該數(shù)為阿姆斯特朗數(shù)(亦稱為自戀性數(shù))。如 407=43+03+73就是一個阿姆斯特朗數(shù)。求1000以內的所有阿姆斯特朗數(shù)。用窮舉法,依次取1000以內的各數(shù)i,將i的各位數(shù)字分解后,據(jù)阿姆斯特朗數(shù)的性質進行計算和判斷。如果一個正整數(shù)等于其各個數(shù)字的立方和,那么稱該數(shù)為阿姆斯特朗數(shù)(亦稱為自戀性數(shù))。如 407=43+03+73就是一個阿姆斯特朗數(shù)。試編程求1000以內的所有阿姆斯特朗數(shù)。

54、問題分析與算法設計可采用窮舉法,依次取1000以內的各數(shù)(設為i),將i的各位數(shù)字分解后,據(jù)阿姆斯特朗數(shù)的性質進行計算和判斷。#include#include int main()int i,t,k,a3;printf(There are follwing Armstrong number smaller than 1000:n);for(i=2;i=10;t+) /*截取整數(shù)i的各位(從高向低位)*/at=(i%k)/(k/10); /*分別賦于a0a2*/k/=10;if(a0*a0*a0+a1*a1*a1+a2*a2*a2=i)/*判斷i是否為阿姆斯特朗數(shù)*/printf(%5d,i);

55、 /*假設滿足條件,那么輸出*/printf(n);system(pause);*運行結果There are following Armstrong number smaller than 1000:153 370 371 407 完全數(shù)如果一個數(shù)恰好等于它的因子之和,那么稱該數(shù)為“完全數(shù)。問題分析與算法設計:根據(jù)完全數(shù)的定義,先計算所選取的整數(shù)a(a的取值11000)的因子,將各因子累加于m,假設m等于a,那么可確認a為完全數(shù)如果一個數(shù)恰好等于它的因子之和,那么稱該數(shù)為“完全數(shù)問題分析與算法設計根據(jù)完全數(shù)的定義,先計算所選取的整數(shù)a(a的取值11000)的因子,將各因子累加于m,假設m等于a

56、,那么可確認a為完全數(shù)。#include#include int main()int a,i,m;printf(There are following perfect numbers smaller than 1000:n);for(a=1;a1000;a+) /*循環(huán)控制選取11000中的各數(shù)進行判斷*/for(m=0,i=1;i=a/2;i+) /*計算a的因子,并將各因子之和m=a,那么a是完全數(shù)輸出*/if(!(a%i)m+=i;if(m=a)printf(%4d ,a);printf(n);system(pause);運行結果TThere are following perfect

57、numbers smaller than 1000:6 28 496 親密數(shù)按親密數(shù)定義,要判斷數(shù)a是否有親密數(shù),只要計算出a的全部因子的累加和為b,再計算b的全部因子的累加和為n,假設n等于a那么可判定a和b是親密數(shù)。計算數(shù)a的各因子的算法:用a依次對i(i=1a/2)進行模運算,假設模運算結果等于0,那么i為a的一個因子;否那么i就不是a的因子。如果整數(shù)A的全部因子(包括1,不包括A本身)之和等于B;且整數(shù)B的全部因子(包括1,不包括B本身)之和等于A,那么將整數(shù)A和B稱為親密數(shù)。求3000以內的全部親密數(shù)。*問題分析與算法設計按照親密數(shù)定義,要判斷數(shù)a是否有親密數(shù),只要計算出a的全部因子

58、的累加和為b,再計算b的全部因子的累加和為n,假設n等于a那么可判定a和b是親密數(shù)。計算數(shù)a的各因子的算法:用a依次對i(i=1a/2)進行模運算,假設模運算結果等于0,那么i為a的一個因子;否那么i就不是a的因子。#include#include int main()int a,i,b,n;printf(There are following friendly-numbers pair smaller than 3000:n);for(a=1;a3000;a+) /*窮舉1000以內的全部整數(shù)*/ for(b=0,i=1;i=a/2;i+) /*計算數(shù)a的各因子,各因子之和存放于b*/if(

59、!(a%i)b+=i; /*計算b的各因子,各因子之和存于n*/for(n=0,i=1;i=b/2;i+)if(!(b%i)n+=i;if(n=a&ab)printf(%4d.%4d ,a,b); /*假設n=a,那么a和b是一對親密數(shù),輸出*/ system(pause);運行結果There are following friendly-numbers pair smaller than 3000:220. 284 1184. 1210 2620. 2924 自守數(shù)自守數(shù)是指一個數(shù)的平方的尾數(shù)等于該數(shù)自身的自然數(shù)。例如:252=625 762=5776 93762=87909376 請求出2

60、00000以內的自守數(shù)。本問題所關心的是積的最后三位。分析產(chǎn)生積的后三位的過程,可以看出,在每一次的局部積中,并不是它的每一位都會對積的后三位產(chǎn)生影響。自守數(shù)是指一個數(shù)的平方的尾數(shù)等于該數(shù)自身的自然數(shù)。例如:252=625 762=5776 93762=87909376請求出200000以內的自守數(shù)問題分析與算法設計假設采用“求出一個數(shù)的平方后再截取最后相應位數(shù)的方法顯然是不可取的,因為計算機無法表示過大的整數(shù)。分析手工方式下整數(shù)平方(乘法)的計算過程,以376為例:376 被乘數(shù)X 376 乘數(shù)-2256 第一個局部積=被乘數(shù)*乘數(shù)的倒數(shù)第一位2632 第二個局部積=被乘數(shù)*乘數(shù)的倒數(shù)第二位

溫馨提示

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

評論

0/150

提交評論