最新C語言競(jìng)賽練習(xí)題40題答案資料_第1頁
最新C語言競(jìng)賽練習(xí)題40題答案資料_第2頁
最新C語言競(jìng)賽練習(xí)題40題答案資料_第3頁
最新C語言競(jìng)賽練習(xí)題40題答案資料_第4頁
最新C語言競(jìng)賽練習(xí)題40題答案資料_第5頁
已閱讀5頁,還剩45頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、精品文檔C語言競(jìng)賽練習(xí)題11 求最大數(shù)問555555的約數(shù)中最大的三位數(shù)是多少?*問題分析與算法設(shè)計(jì)根據(jù)約數(shù)的定義,對(duì)于一個(gè)整數(shù)N,除去1和它自身外,凡能整除 N的數(shù)即為N的約數(shù)。因此,最簡(jiǎn)單的方法是用 2到N-1之間的所有數(shù)去除 N,即可求出N的全部約數(shù)。本 題只要求取約數(shù)中最大的三位數(shù),則其取值范圍可限制在100到999之間。*程序說明與注釋#in clude<stdio.h>void mai n()long i;int j;prin tf("Please in put nu mber:");scan f("%ld", &i);f

2、or(j=999;j>=100;j-)if(i%j=O)prin tf("The max factor with 3 digits in %ld is:%d,n",i,j);break;*運(yùn)行結(jié)果輸入:555555輸出:The max factor with 3 digits in 555555 is:7772.高次方數(shù)的尾數(shù)求13的13次方的最后三位數(shù)*問題分析與算法設(shè)計(jì)解本題最直接的方法是:將13累乘13次方截取最后三位即可。但是由于計(jì)算機(jī)所能表示的整數(shù)范圍有限,用這種“正確”的算法不可能得到正確的結(jié)果。事實(shí)上,題目?jī)H要求最后三位的值,完全沒有必要求13的13次方

3、的完整結(jié)果。研究乘法的規(guī)律發(fā)現(xiàn):乘積的最后三位的值只與乘數(shù)和被乘數(shù)的后三位有關(guān),與乘數(shù)和被乘數(shù)的高位無關(guān)。利用這一規(guī)律,可以大大簡(jiǎn)化程序。*程序說明與注釋#in clude<stdio.h>void mai n()int i,x,y,last=1; /*變量last保存求X的Y次方過程中的部分乘積的后三位*/prin tf("I nput X and Y(X*Y):");scan f("%d*%d", &x,& y);for(i=1;i<=y;i+)/*X 自乘 Y 次*/last=last*x%1000; /*將las

4、t乘X后對(duì)1000取模,即求積的后三位*/printf("The last 3 digits of %d*%d is:%dn",x,y,last%1000); /*打印結(jié)果 */*運(yùn)行結(jié)果In put X and Y(X*Y):13*13The last 3 digits of 13*13 is:253In put X and Y(X*Y):13*20The last 3 digits of 13*20 is:8013.借書方案知多少小明有五本新書,要借給A , B, C三位小朋友,若每人每次只能借一本,則可以有多少種不同的借法?*問題分析與算法設(shè)計(jì)本問題實(shí)際上是一個(gè)排列問

5、題,即求從5個(gè)中取3個(gè)進(jìn)行排列的方法的總數(shù)。 首先對(duì)五本書從1至5進(jìn)行編號(hào),然后使用窮舉的方法。 假設(shè)三個(gè)人分別借這五本書中的一本,當(dāng)三個(gè)人所借的書的編號(hào)都不相同時(shí),就是滿足題意的一種借閱方法。*程序說明與注釋void mai n()int a,b,c,co un t=0;prin tf("There are diffre nt methods for XM to distribute books to 3 readers:n");for(a=1;a<=5;a+)/*窮舉第一個(gè)人借 5本書中的1本的全部情況*/for(b=1;b<=5;b+)/*窮舉第二個(gè)人借

6、5本書中的一本的全部情況*/for(c=1;a!=b&&c<=5;c+)/*當(dāng)前兩個(gè)人借不同的書時(shí),窮舉第三個(gè)人借5本書中的1本的全部情況*/if(c!=a&&c!=b)/*判斷第三人與前兩個(gè)人借的書是否不同*/prin tf(cou nt%8?"%2d:%d,%d,%d":"%2d:%d,%d,%d n",+co un t,a,b,c);/*打印可能的借閱方法*/*運(yùn)行結(jié)果There are diffre nt methods for XM to distribute books to 3 readers:1: 1

7、,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,3

8、39: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,34.數(shù)制轉(zhuǎ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)。對(duì)于C語言來說,一個(gè)整數(shù)在計(jì)算機(jī)內(nèi)就是以二進(jìn)制的形式存儲(chǔ)的,所以沒有必要再將一個(gè)整數(shù)經(jīng)過一系列的運(yùn)算

9、轉(zhuǎn)換為二進(jìn)制形式,只要將整數(shù)在內(nèi)存中的二進(jìn)制表示輸出即可。*程序說明與注釋#in clude<stdio.h> void prin tb(i nt, in t); void mai n()int x;pri ntf("l nput nu mber:");scan f("%d",& x);printf("nu mber of decimal form:%dn",x);printf(”it's binary form:");printb(x,sizeof(int)*8);/*x:整數(shù) sizeof(i

10、nt):int 型在內(nèi)存中所占的字節(jié)數(shù)sizeof(int)*8:int 型對(duì)應(yīng)的位數(shù) */ putchar('n');void prin tb(i nt x,i nt n)if(n >0)putchar('0'+(unsigned)(x&(1<<(n-1)>>(n-1);/* 輸出第 n 位*/printb(x,n-1);/*歸調(diào)用,輸出x的后n-1位*/*運(yùn)行結(jié)果輸入:8 輸出:nu mber of decimal form:8it's bun ary form:0000000000001000輸入:-8輸出:

11、nu mber of decimal form:-8it's binary form:1111111111111000輸入:32767輸出:number of decimal form:32767it's binary form:0111111111111111輸入:-32768輸出:number of decimal form:-32768it's bin ary form:1000000000000000輸入:128輸出: nu mber of decimal form:128it's bin ary form:00000000100000005. 打魚還是

12、曬網(wǎng)中國(guó)有句俗語叫“三天打魚兩天曬網(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除盡 且

13、 不能被100除盡)或能被400除盡) 則該年是閏年;否則不是閏年。C語言中判斷能否整除可以使用求余運(yùn)算(即求模)*程序與程序注釋#in clude<stdio.h>int days(struct date day);struct dateint year;int mon th;int day;void mai n()struct date today,term;int yearday,year,day;prin tf("E nter year/m on th/day:");scanf("%d%d%d",&today.year,&am

14、p;today.month,&today.day);I* 輸入日期 */term.mo nth=12;I*設(shè)置變量的初始值:月*Iterm.day=31;I*設(shè)置變量的初始值:日*Ifor(yearday=0,year=1990;year<today.year;year+)I*計(jì)算從1990年至指定年的前一年共有多少天*I/*加上指定年中到指定日期的天數(shù)*II*求余數(shù)*Iterm.year=year; yearday+=days(term); yearday+=days(today); day=yearday%5;if(day>0&&day<4) pr

15、intf("he was fishing at that day.n");I* 打印結(jié)果 *Ielse prin tf("He was sleep ing at that day. n"); int days(struct date day)I*平均每月的天數(shù)*Istatic int day_tab213=0,31,28,31,30,31,30,31,31,30,31,30,31,0,31,29,31,30,31,30,31,31,30,31,30,31,;int i,lp;lp=day.year%4=0&&day.year%100!=0

16、|day.year%400=0;/*判定year為閏年還是平年,lp=0為平年,非0為閏年*/for(i=1;i<day.month;i+)/*計(jì)算本年中自1月1日起的天數(shù)*/day.day+=day_tablp;retur n day.day;*運(yùn)行結(jié)果Enter year/mo nth/day:1991 10 25He was fish ing at day.Enter year/mo nth/day:1992 10 25He was sleep ing at day.En ter year/mo nth/day:1993 10 25He was sleep ing at day6.

17、 抓交通肇事犯一輛卡車違反交通規(guī)則,撞人后逃跑?,F(xiàn)場(chǎng)有三人目擊事件,但都沒有記住車號(hào), 只記下車號(hào)的一些特征。甲說:牌照的前兩位數(shù)字是相同的; 乙說:牌照的后兩位數(shù)字是相同的, 但與前兩位不同;丙是數(shù)學(xué)家,他說:四位的車號(hào)剛好是一個(gè)整數(shù)的平方。請(qǐng)根據(jù)以上線索求出車號(hào)。*問題分析與算法設(shè)計(jì)按照題目的要求造出一個(gè)前兩位數(shù)相同、后兩位數(shù)相同且相互間又不同的整數(shù),然后判 斷該整數(shù)是否是另一個(gè)整數(shù)的平方。*程序與程序注釋#in clude<stdio.h> #in clude<math.h>void mai n()int i,j,k,c;/*i:車號(hào)前二位的取值*/*j:車號(hào)后二

18、位的取值*/*判斷二位數(shù)字是否相異*/for(i=1;i<=9;i+) for(j=0;j<=9;j+) if(i!=j)k=i*1000+i*100+j*10+j; /*計(jì)算出可能的整數(shù) */*若是,打印結(jié)果*/for(c=31;c*c<k;c+);/*判斷該數(shù)是否為另一整數(shù)的平方*/ if(c*c=k) pri ntf("Lorry-No. is %d.n",k);*運(yùn)行結(jié)果Lorry _No.is 77447. 該存多少錢假設(shè)銀行一年整存零取的月息為0.63%o現(xiàn)在某人手中有一筆錢,他打算在今后的五年中的年底取出1000元,到第五年時(shí)剛好取完,請(qǐng)算出

19、他存錢時(shí)應(yīng)存入多少。*問題分析與算法設(shè)計(jì)分析存錢和取錢的過程,可以采用倒推的方法。若第五年年底連本帶息要取1000元,則要先求出第五年年初銀行存款的錢數(shù):第五年初存款=1000心+12*0.0063)依次類推可以求出第四年、第三年的年初銀行存款的錢數(shù):第四年年初存款=(第五年年初存款 +1000)/(1 + 12*0.0063)+ 1000)/(1 + 12*0.0063)+ 1000)/(1 + 12*0.0063)第三年年初存款=(第四年年初存款 第二年年初存款=(第三年年初存款第一年年初存款=(第二年年初存款+ 1000)/(1 + 12*0.0063)精品文檔通過以上過程就可以很容易地

20、求出第一年年初要存入多少錢。*程序與程序注釋#in clude<stdio.h> void mai n()int i;float total=0;for(i=0;i<5;i+)/*i 為年數(shù),取值為 04 年*/total=(total+1000)/(1+0.0063*12);/*累計(jì)算出年初存款數(shù)額,第五次的計(jì)算結(jié)果即為題解*/prin tf("He must save %.2f at first.W n",total);*運(yùn)行結(jié)果He must save 4039.44 at first8. 怎樣存錢利最大假設(shè)銀行整存整取存款不同期限的月息利率分別為:

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

22、i3次,5年存 i5次,8年存i8次,則到期時(shí)存款人應(yīng)得到的本利合計(jì)為:2000*(1+rate1)i1*(1+rate2)i2*(1+rate3)i3*(1+rate5)i5*(1+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<=i1=20-8*i8-5*i5-3*i3-2*i2可以用窮舉法窮舉所有的i8、i5、i3、i2和i1的組合,代入求本利的

23、公式計(jì)算出最大值,就是最佳存款方案。*程序與程序注釋#in clude<stdio.h>#in clude<math.h>void mai n()int i8,i5,i3,i2,i1, n8,n5,n3,n2,n1;float max=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

24、-3*i3-2*i2;term=2000.0*pow(double)(1+0.0063*12),(double)i1) *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 ;n 1=i1; n2=i2; n3=i3 ;n 5=i5 ;n 8=i8;pri

25、n tf("For maxinum profit,he should so save his money in a ban k: n");printf(”madefixeddeposit for 8year:%dtimes n", n8);printf(”madefixeddeposit for 5year:%dtimes n", n5);printf(”madefixeddeposit for 3year:%dtimes n", n3);printf(”madefixeddeposit for 2year:%dtimes n", n

26、2);printf(”madefixeddeposit for 1year:%dtimes n", n1);prin tf("Toal: %.2fn",max);/*輸出存款方式*/*運(yùn)行結(jié)果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 fo

27、r 2 year: 0timesmade fixed deposit for 1 year: 0timesTotal:8841.01可見最佳的存款方案為連續(xù)四次存5年期。9. 捕魚和分魚A、B、C、D、E五個(gè)人在某天夜里合伙去捕魚,到第二天凌晨時(shí)都疲憊不堪,于是各 自找地方睡覺。日上三桿,A第一個(gè)醒來,他將魚分為五份,把多余的一條魚扔掉,拿走自己的一份。B第二個(gè)醒來,也將魚分為五份,把多余的一條魚扔掉,保持走自己的一份。C、D、E依次醒來,也按同樣的方法拿走魚。問他們合伙至少捕了多少條魚?*問題分析與算法設(shè)計(jì)根據(jù)題意,總計(jì)將所有的魚進(jìn)行了五次平均分配,每次分配時(shí)的策略是相同的,即扔掉一條魚后剩

28、下的魚正好分成五份,然后拿走自己的一份,余下其它的四份。假定魚的總數(shù)為 X,則X可以按照題目的要求進(jìn)行五次分配:X-1后可被5整除,余下的魚為4*(X-1)、5。若X滿足上述要求,則 X就是題目的解。*程序與程序注釋#in clude<stdio.h>void mai n()int n,i,x,flag=1;/*flag :控制標(biāo)記 */for(n=6;flag;n+)/*采用試探的方法。令試探值n逐步加大*/for(x=n ,i=1 && flag;i<=5;i+)if(x-1)%5=0) x=4*(x-1)/5;else flag=0;/*若不能分配則置標(biāo)

29、記falg=0退出分配過程*/if(flag) break;/*若分配過程正常結(jié)束則找到結(jié)果退出試探的過程*/else flag=1;/*否則繼續(xù)試探下一個(gè)數(shù)*/printf("Total number of fish catched=%dn",n);/* 輸出結(jié)果 */*運(yùn)行結(jié)果Total number of fish catched = 3121*問題的進(jìn)一步討論程序采用試探法,試探的初值為 6,每次試探的步長(zhǎng)為1。這是過分保守的做法。可以在進(jìn)一步分析題目的基礎(chǔ)上修改此值,增大試探的步長(zhǎng)值,以減少試探次數(shù)。*思考題請(qǐng)使用其它的方法求解本題10. 出售金魚買賣提將養(yǎng)的一缸

30、金魚分五次出售系統(tǒng)上一次賣出全部的一半加二分之一條;第二次賣出余下的三分之一加三分之一條;第三次賣出余下的四分之一加四分之一條;第四次賣出余下的五分之一加五分之一條;最后賣出余下的11條。問原來的魚缸中共有幾條金魚?*題目分析與算法設(shè)計(jì)題目中所有的魚是分五次出售的,每次賣出的策略相同;第j次賣剩下的(j+1)分之一再加1/(j+1)條。第五次將第四次余下的11條全賣了。假定第j次魚的總數(shù)為X,則第j次留下:x-(x+1)/(j+1)當(dāng)?shù)谒拇纬鍪弁戤厱r(shí),應(yīng)該剩下11條。若X滿足上述要求,則 X就是題目的解。應(yīng)當(dāng)注意的是:"(x+1)/(j+1)"應(yīng)滿足整除條件。試探X的初值可

31、以從23開始,試探的步長(zhǎng)為2,因?yàn)閄的值一定為奇數(shù)。*程序說明與注釋#in clude<stdio.h>void mai n()/*n為標(biāo)志變量*/*控制試探的步長(zhǎng)和過程*/*完成出售四次的操作*/*若滿足整除條件則進(jìn)行實(shí)際的出售操作*/*否則停止計(jì)算過程*/*若第四次余下11條則滿足題意*/int i,j, n=0, x;for(i=23; n=0;i+=2)for(j=1,x=i;j<=4&& x>=11;j+) if(x+1)%(j+1)=0) x-=(x+1)/(j+1);else x=0;break;if(j=5&&x=11)/

32、*輸出結(jié)果*/*控制退出試探過程*/prin tf("There are %d fishes at first.W n",i);n=1;*運(yùn)行結(jié)果There are 59 fishes at first.11. 分?jǐn)?shù)四則運(yùn)算對(duì)輸入的兩個(gè)分?jǐn)?shù)進(jìn)行+、-、*、/四則運(yùn)算,輸出分?jǐn)?shù)結(jié)果。算法分析如下:對(duì)分?jǐn)?shù)b/a與d/c,不管哪一種運(yùn)算,其運(yùn)算結(jié)果均為y/x形式。對(duì)結(jié)果y/x進(jìn)行化簡(jiǎn),約去分子分母的公因數(shù):試用i(i=1,.,y)對(duì)y,x進(jìn)行試商,若能同時(shí)整除 y,x,則y,x同時(shí)約去公因數(shù)i,最后打印約簡(jiǎn)的分?jǐn)?shù)。程序代碼如下:#in clude<stdio.h>vo

33、id mai n()long int a,b,c,d,i,x,y, z;char op;printf("兩分?jǐn)?shù)b/a,d/c作+,-, *, /四則運(yùn)算,結(jié)果為分?jǐn)?shù)。n");printf(”請(qǐng)輸入分?jǐn)?shù)運(yùn)算式。n");scan f("%ld/%ld%c%ld/%ld",&b, &a,& op, &d,&c);if(a=0|c=0) printf("分母為 0 輸入錯(cuò)誤!");exit(0);if(op='+')y=b*c+d*a;x=a*c;/* 運(yùn)算結(jié)果均為 y/x*/

34、if(op='-')y=b*c-d*a,x=a*c;if(op='*')y=b*d;x=a*c; if(op='/')y=b/c;x=a/d; z=x;if(x>y) z=y;i=z;while(i>1)/*y/x分子分母約去公因數(shù)*/if(x%i=O&& y%i=0)x=x/i;y=y/i;co nti nue;i-;prin tf("%ld/%ld%c%ld/%ld=%ld/%ld.n",b,a,op,d,c,y,x);12. 平分七筐魚甲、乙、丙三位魚夫出海打魚,他們隨船帶了21只籮筐。當(dāng)晚返

35、航時(shí),他們發(fā)現(xiàn)有七筐裝滿了魚,還有七筐裝了半筐魚,另外七筐則是空的,由于他們沒有秤,只好通過目測(cè)認(rèn)為七個(gè)滿筐魚的重量是相等的,7個(gè)半筐魚的重量是相等的。在不將魚倒出來的前提下,怎樣將魚和筐平分為三份?*問題分析與算法設(shè)計(jì)根據(jù)題意可以知道:每個(gè)人應(yīng)分得七個(gè)籮筐,其中有 3.5筐魚。采用一個(gè)3*3的數(shù)組a 來表示三個(gè)人分到的東西。其中每個(gè)人對(duì)應(yīng)數(shù)組a的一行,數(shù)組的第0列放分到的魚的整筐數(shù),數(shù)組的第1列放分到的半筐數(shù),數(shù)組的第2列放分到的空筐數(shù)。由題目可以推出:。數(shù)組的每行或每列的元素之和都為7 ;。對(duì)數(shù)組的行來說,滿筐數(shù)加半筐數(shù)=3.5 ;。每個(gè)人所得的滿筐數(shù)不能超過3筐;。每個(gè)人都必須至少有1個(gè)

36、半筐,且半筐數(shù)一定為奇數(shù)對(duì)于找到的某種分魚方案,三個(gè)人誰拿哪一份都是相同的,為了避免出現(xiàn)重復(fù)的分配方案,可以規(guī)定:第二個(gè)人的滿筐數(shù)等于第一個(gè)人的滿筐數(shù);第二個(gè)人的半筐數(shù)大于等于第一個(gè)人的半筐數(shù)。*程序與程序注釋#in clude<stdio.h>int a33,cou nt;void mai n()int i,j,k,m, n,flag;prin tf("It exists possible distribti on pla ns:n"); for(i=0;i<=3;i+)/*試探第一個(gè)人滿筐 a00的值,滿筐數(shù)不能>3*/a00=i;for(j=i

37、;j<=7-i&&j<=3;j+)/*試探第二個(gè)人滿筐a10的值,滿筐數(shù)不能>3*/a10=j;if(a20=7-j-a00)>3)co ntinue;/* 第三個(gè)人滿筐數(shù)不能 >3*/if(a20<a10)break;/*要求后一個(gè)人分的滿筐數(shù)>=前一個(gè)人,以排除重復(fù)情況*/for(k=1;k<=5;k+=2)/*試探半筐a01的值,半筐數(shù)為奇數(shù) */a01=k;for(m=1;m<7-k;m+=2)/*試探 半筐a11的值,半筐數(shù)為奇數(shù) */a11=m; a21=7-k-m;for(flag=1, n=0;flag&am

38、p;&n <3; n+)/*判斷每個(gè)人分到的魚是3.5筐,flag為滿足題意的標(biāo)記變量*/if(a n0+a n1<7&&a n0*2+a n1=7)a n2=7-a n0-a n 1;/*計(jì)算應(yīng)得到的空筐數(shù)量 */else flag=0;/*不符合題意則置標(biāo)記為0*/if(flag)prin tf("No.%dFull basket Semi-basket Emptyn",+cou nt);for(n=0;n<3;n+)prin tf(" fisher %c:%d %d %dn",'A'+n,a

39、 nO,a n1,a n2);*運(yùn)行結(jié)果It exists possible distributi on pla ns: No.1Full basketfisher A:1fisher B:3fisher C:No.23Full basketfisher A:2fisher B:2fisher C:3Semi-basketEmpty511313Semi-basketEmpty323213*思考題晏會(huì)上數(shù)學(xué)家出了一道難題:假定桌子上有三瓶啤酒, 癬瓶子中的酒分給幾個(gè)人喝,但喝各瓶酒的人數(shù)是不一樣的。不過其中有一個(gè)人喝了每一瓶中的酒,且加起來剛好是一瓶, 請(qǐng)問喝這三瓶酒的各有多少人?(答案:喝三瓶

40、酒的人數(shù)分別是 2人、3人和6人)13.有限5位數(shù)個(gè)位數(shù)為6且能被3整除的五位數(shù)共有多少?*題目分析與算法設(shè)計(jì)根據(jù)題意可知,滿足條件的五位數(shù)的選擇范圍是10006、10016。99996??稍O(shè)基礎(chǔ)數(shù)i=1000,通過計(jì)算i*10+6即可得到欲選的數(shù)(i的變化范圍是1000999),再判斷該數(shù)能否被 3整除。*程序說明與注釋#in clude<stdio.h> void mai n()long int i;/*co unt:統(tǒng)計(jì)滿足條件的五位數(shù)的個(gè)數(shù)*/*判斷所選的數(shù)能否被3整除*/*若滿足條件則計(jì)數(shù)*/int coun t=0;for(i=1000;i<9999;i+) if

41、(!(i*10+6)%3) coun t+;prin tf("cou nt=%d n" ,cou nt);*運(yùn)行結(jié)果coun t=299914. 除不盡的數(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從0開始取值),用逆推法可以列出關(guān)系式:(i*8+7)*8)+1)*8+1=(2*i*17)+15)*18+4再用試探法求出商i的值。*程序說明與注釋#in clude<stdio.h

42、>void mai n()int i;for(i=0;i+)/* 試探商的值 */if(i*8+7)*8+1)*8+ 仁=(34*i+15)*17+4)/*逆推判斷所取得的當(dāng)前i值是否滿足關(guān)系式*/*若滿足則輸出結(jié)果*/prin tf("The required number is: %dn ",(34*i+15)*17+4);break;/*退出循環(huán)*/*運(yùn)行結(jié)果The required nu mber is:199315. 一個(gè)奇異的三位數(shù)一個(gè)自然數(shù)的七進(jìn)制表達(dá)式是一個(gè)三位數(shù),而這個(gè)自然數(shù)的九進(jìn)制表示也是一個(gè)三位 數(shù),且這兩個(gè)三位數(shù)的數(shù)碼正好相反,求這個(gè)三位數(shù)。*

43、題目分析與算法設(shè)計(jì)根據(jù)題意可知,七進(jìn)制和九進(jìn)制表示的這全自然數(shù)的每一位一定小于7,可設(shè)其七進(jìn)制數(shù)形式為kji(i、j、k的取值分別為16),然后設(shè)其九進(jìn)制表示形式為ijk。*程序說明與注釋#in clude<stdio.h>void mai n() int i,j,k;for(i=1;i<7;i+)for(j=0;j<7;j+) for(k=1;k<7;k+)if(i*9*9+j*9+k=i+j*7+k*7*7)prin tf("The special nu mber with 3 digits is:");prin tf("%d%d

44、%d(7)=%d%d%d(9)=%d(10)n",k,j,i,i,j,k,i*9*9+j*9+k);*運(yùn)行結(jié)果The special number with 3 digits is:503(7)=305(9)=248(10)16. 位反序數(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,其取值均為09,則滿足關(guān)系式: (i*103+j*102+10*k+l)*9=(l*103+k*102+10*j+i)的i、j、k、丨即構(gòu)成N。*程序說明與注釋

45、#in clude<stdio.h>void mai n() int i; for(i=1002;i<1111;i+)/*窮舉四位數(shù)可能的值 */if(i%10*1000+i/10%10*100+i/100%10*10+i/1000=i*9)/*判斷反序數(shù)是否是原整數(shù)的9倍*/prin tf("The nu mber satisfied stats con diti on is: %dn ",i);/*若是則輸出*/*運(yùn)行結(jié)果The nu mber satisfied states con diti on is:108917. 求車速一輛以固定速度行駛的汽

46、車,司機(jī)在上午10點(diǎn)看到里程表上的讀數(shù)是一個(gè)對(duì)稱數(shù)(即這 個(gè)數(shù)從左向右讀和從右向左讀是完全一樣的),為95859。兩小時(shí)后里程表上出現(xiàn)了一個(gè)新的對(duì)稱數(shù)。問該車的速度是多少?新的對(duì)稱數(shù)是多少?*題目分析與算法設(shè)計(jì)根據(jù)題意,設(shè)所求對(duì)稱數(shù)為 i,其初值為95589,對(duì)其依次遞增取值,將 i值的每一位 分解后與其對(duì)稱位置上的數(shù)進(jìn)行比較,若每個(gè)對(duì)稱位置上的數(shù)皆相等,則可判定i即為所求的對(duì)稱數(shù)。*程序說明與注釋#in clude<stdio.h>void mai n() int t,a5;/*數(shù)組a存放分解的數(shù)字位*/long int k,i;for(i=95860;i+)/* 以 95860

47、 為初值,循環(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)prin tf("The new symmetrical nu mber kelometers is:%d%d%d%d%d n", a0,a1,a2,a3,a4);prin tf("The velocity of the car is: %.2fn",(i-95859)/2.0); break;*運(yùn)行結(jié)果The

48、 new symmetrical nu mber kelometers is:95959.The velocity of the car is:50.00*思考題將一個(gè)數(shù)的數(shù)碼倒過來所得到的新數(shù)叫原數(shù)的反序數(shù)。如果一個(gè)數(shù)等于它的反序數(shù),則稱它為對(duì)稱數(shù)。求不超過1993的最大的二進(jìn)制的對(duì)稱數(shù)18. 阿姆斯特朗數(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ì)算和

49、判斷。*程序說明與注釋#in clude<stdio.h>void mai n()int i,t,k,a3;prin tf("There are follwi ng Armstro ng nu mber smaller tha n 1000:n ”);for(i=2;i<1000;i+)/*窮舉要判定的數(shù)i的取值范圍 21000*/for(t=0,k=1000;k>=10;t+)/*截取整數(shù)i的各位(從高向低位 廣/at=(i%k)/(k/10);/* 分別賦于 a0a2*/k/=10; if(a0*a0*a0+a1*a1*a1+a2*a2*a2=i)/*判斷

50、i是否為阿姆斯特朗數(shù)*/prin tf("%5d",i);/*若滿足條件,則輸出 */prin tf("n");*運(yùn)行結(jié)果There are followi ng Armstro ng nu mber smaller tha n 1000:153370371407佃. 完全數(shù)如果一個(gè)數(shù)恰好等于它的因子之和,則稱該數(shù)為“完全數(shù)”。*題目分析與算法設(shè)計(jì)根據(jù)完全數(shù)的定義,先計(jì)算所選取的整數(shù)a(a的取值11000)的因子,將各因子累加于m,若m等于a,則可確認(rèn)a為完全數(shù)。*程序說明與注釋#in clude<stdio.h>void mai n()in

51、t a,i,m;prin tf("There are followi ng perfect nu mbers smaller tha n 1000: n");for(a=1;a<1000;a+)/*循環(huán)控制選取11000中的各數(shù)進(jìn)行判斷*/for(m=0,i=1;i<=a/2;i+)/*計(jì)算a的因子,并將各因子之和m=a,則a是完全數(shù)輸出*/if(!(a%i)m+=i;if(m=a)prin tf("%4d",a);prin tf("n");*運(yùn)行結(jié)果TThere are followi ng perfect nu mbe

52、rs smaller tha n 1000:62849620. 親密數(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依次對(duì)i(i=1a/2)進(jìn)行模運(yùn)算,若模運(yùn)算結(jié)果等于0,則i為a的一個(gè)因子;否則i就不是a的因子。*程序說明與注釋#in clude<stdio.h

53、> void mai n()int a,i,b ,n;prin tf("There are followi ng frien dly-nu mbers pair smaller tha n 3000:n"); for(a=1;a<3000;a+)/*窮舉1000以內(nèi)的全部整數(shù)*/*計(jì)算數(shù)a的各因子,各因子之和存放于b*/*計(jì)算b的各因子,各因子之和存于n*/for(b=0,i=1;i<=a/2;i+)if(!(a%i)b+=i;for(n=0,i=1;i<=b/2;i+)if(!(b%i) n+=i;if(n=a&&a<b)pr

54、intf("%4d.%4d",a,b);/* 若 n=a,則 a 和 b 是一對(duì)親密數(shù),輸出 */*運(yùn)行結(jié)果There are follow ing frien dly-nu mbers pair smaller tha n 3000:220.2841184. 12102620. 292421. 自守?cái)?shù)自守?cái)?shù)是指一個(gè)數(shù)的平方的尾數(shù)等于該數(shù)自身的自然數(shù)。例如:252=625762=577693762=87909376請(qǐng)求出200000以內(nèi)的自守?cái)?shù)*題目分析與算法設(shè)計(jì)若采用“求出一個(gè)數(shù)的平方后再截取最后相應(yīng)位數(shù)”的方法顯然是不可取的,因?yàn)橛?jì)算機(jī)無法表示過大的整數(shù)。分析手工方式下

55、整數(shù)平方(乘法)的計(jì)算過程,以376為例:376被乘數(shù)X 376乘數(shù)2256第一個(gè)部分積=被乘數(shù)*乘數(shù)的倒數(shù)第一位2632第二個(gè)部分積=被乘數(shù)*乘數(shù)的倒數(shù)第二位1128第三個(gè)部分積=被乘數(shù)*乘數(shù)的倒數(shù)第三位141376積本問題所關(guān)心的是積的最后三位。分析產(chǎn)生積的后三位的過程,可以看出,在每一次的部分積中,并不是它的每一位都會(huì)對(duì)積的后三位產(chǎn)生影響。總結(jié)規(guī)律可以得到: 在三位數(shù)乘法中,對(duì)積的后三位產(chǎn)生影響的部分積分別為:第一個(gè)部分積中:被乘數(shù)最后三位*乘數(shù)的倒數(shù)第一位第二個(gè)部分積中:被乘數(shù)最后二位 *乘數(shù)的倒數(shù)第二位 第三個(gè)部分積中:被乘數(shù)最后一位 *乘數(shù)的倒數(shù)第三位將以上的部分積的后三位求和后截取后三位就是三位數(shù)乘積的后三位。這樣的規(guī)律可以推廣到同樣問題的不同位數(shù)乘積。按照手工計(jì)算的過程可以設(shè)計(jì)算法編寫程序。*程序說明與注釋#in clude<stdio.h>void mai n() long mul, nu mber,k,ll,kk;prin tf("It exists followi ng automorphic n mbers small tha n 200000: n");for(nu mber= 0;nu m

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(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)論