C語言大賽題目精選(帶答案)_第1頁
C語言大賽題目精選(帶答案)_第2頁
C語言大賽題目精選(帶答案)_第3頁
C語言大賽題目精選(帶答案)_第4頁
C語言大賽題目精選(帶答案)_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第1題 歌手大賽問題題目:青年歌手參加歌曲大獎賽,有10個評委進(jìn)行打分,試編程求這位選手的平均得分。3種方法:分別要求使用到排序,數(shù)組,函數(shù),指針。分析:這道題的核心程序是排序,將評委打的10個分?jǐn)?shù)利用數(shù)組按增序(或降序)排列,計算數(shù)組中除了第一個和最后一個分?jǐn)?shù)以外的數(shù)以外的數(shù)的平均分答案:#include<stdio.h>double Aver(int p,int count) /求出結(jié)果,p為整型數(shù)組,count為數(shù)組大小double result=0; for(inti=0;i<count-1;i+) /排序for(int j=i;j<count;j+) if(p

2、i<pj) int temp=pi;pi=pj;pj=temp; printf("評委打分按順序:"); for(int m=0;m<10;m+) /顯示排序后結(jié)果printf("%d ",pm);printf("n"); for(int k=1;k<count-1;k+) /求出去掉首尾的平均分result+=pk;result/=count-2;return result;void main()printf("請輸入10組評分:n");int p10;inti; for(i=0;i<10

3、;i+) /輸入評分 printf("輸入評委%d打分:",i+1);scanf("%d",&pi); double result=Aver(p,10); /計算平均分printf("n平均分為%5.2fn",result);1 11.打魚還是曬網(wǎng)中國有句俗語叫“三天打魚兩天曬網(wǎng)”。某人從1990年1月1日起開始“三天打魚兩天曬網(wǎng)”,問這個人在以后的某一天中是“打魚”還是“曬網(wǎng)”。*問題分析與算法設(shè)計根據(jù)題意可以將解題過程分為三步:1)計算從1990年1月1日開始至指定日期共有多少天;2)由于“打魚”和“曬網(wǎng)”的周期為5天,所

4、以將計算出的天數(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語言中判斷能否整除可以使用求余運算(即求模)*程序與程序注釋#include<stdio.h>int days(struct date day);struct dateint year;int month;int da

5、y;void main()struct date today,term;intyearday,year,day;printf("Enter year/month/day:");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+) term.year=yea

6、r;yearday+=days(term); /*計算從1990年至指定年的前一年共有多少天*/ yearday+=days(today); /*加上指定年中到指定日期的天數(shù)*/ day=yearday%5; /*求余數(shù)*/if(day>0&&day<4) printf("he was fishing at that day.n"); /*打印結(jié)果*/elseprintf("He was sleeping at that day.n");int days(struct date day)staticintday_tab213=

7、 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為閏年還是平年,lp=0為平年,非0為閏年*/ for(i=1;i<day.month;i+) /*計算本年中自1月1日起的天數(shù)*/day.day+=day_tablp;returnday.day;*運行結(jié)果 Enter year/month/day:1991 1

8、0 25 He was fishing at day. Enter year/month/day:1992 10 25 He was sleeping at day. Enter year/month/day:1993 10 25 He was sleeping at day2 12.抓交通肇事犯一輛卡車違反交通規(guī)則,撞人后逃跑?,F(xiàn)場有三人目擊事件,但都沒有記住車號,只記下車號的一些特征。甲說:牌照的前兩位數(shù)字是相同的;乙說:牌照的后兩位數(shù)字是相同的,但與前兩位不同;丙是數(shù)學(xué)家,他說:四位的車號剛好是一個整數(shù)的平方。請根據(jù)以上線索求出車號。*問題分析與算法設(shè)計按照題目的要求造出一個前兩位數(shù)相同

9、、后兩位數(shù)相同且相互間又不同的整數(shù),然后判斷該整數(shù)是否是另一個整數(shù)的平方。*程序與程序注釋#include<stdio.h>#include<math.h>void main()inti,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*c<k;c+); /*判斷該數(shù)是否為另一整數(shù)的平方*/if(c*c=k) printf(

10、"Lorry-No. is %d.n",k); /*若是,打印結(jié)果*/ *運行結(jié)果 Lorry _No.is 77443 14.怎樣存錢利最大假設(shè)銀行整存整取存款不同期限的月息利率分別為: 0.63% 期限=1年 0.66% 期限=2年 0.69% 期限=3年 0.75% 期限=5年 0.84% 期限=8年利息=本金*月息利率*12*存款年限。現(xiàn)在某人手中有2000元錢,請通過計算選擇一種存錢方案,使得錢存入銀行20年后得到的利息最多(假定銀行對超過存款期限的那一部分時間不付利息)。*問題分析與算法為了得到最多的利息,存入銀行的錢應(yīng)在到期時馬上取出來,然后立刻將原來的本金和

11、利息加起來再作為新的本金存入銀行,這樣不斷地滾動直到滿20年為止,由于存款的利率不同,所以不同的存款方法(年限)存20年得到的利息是不一樣的。分析題意,設(shè)2000元存20年,其中1年存i1次,2年存i2次,3年存i3次,5年存i5次,8年存i8次,則到期時存款人應(yīng)得到的本利合計為: 2000*(1+rate1)i1*(1+rate2)i2*(1+rate3)i3*(1+rate5)i5*(1+rate8)i8其中rateN為對應(yīng)存款年限的利率。根據(jù)題意還可得到以下限制條件: 0<=i8<=2 0<=i5<=(20-8*i8)/5 0<=i3<=(20-8*i

12、8-5*i5)/3 0<=i2<=(20-8*i8-5*i5-3*i3)/2 0<=i1=20-8*i8-5*i5-3*i3-2*i2可以用窮舉法窮舉所有的i8、i5、i3、i2和i1的組合,代入求本利的公式計算出最大值,就是最佳存款方案。*程序與程序注釋#include<stdio.h>#include<math.h>void main()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<=(2

13、0-8*i8)/5;i5+)for(i3=0;i3<=(20-8*i8-5*i5)/3;i3+)for(i2=0;i2<=(20-8*i8-5*i5-3*i3)/2;i2+) i1=20-8*i8-5*i5-3*i3-2*i2;term=2000.0*pow(double)(1+0.0063*12),(double)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

14、)(1+8*0.0084*12),(double)i8); /*計算到期時的本利合計*/if(term>max) max=term;n1=i1;n2=i2;n3=i3;n5=i5;n8=i8; printf("For maxinumprofit,he should 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&qu

15、ot;,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);printf(" Toal: %.2fn",max); /*輸出存款方式*/*運行結(jié)果For maxinumprofit,he should so save his mone

16、y 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: 0times Total:8841.01可見最佳的存款方案為連續(xù)四次存5年期。4 51.誰是竊賊公安人員審問四名竊賊嫌疑犯。已知,這四人當(dāng)中僅有一名是竊賊,還知道這四人中每人要么是誠實的,要么總是說謊的。在回答公安人員

17、的問題中:甲說:“乙沒有偷,是丁偷的。”乙說:“我沒有偷,是丙便的?!北f:“甲沒有偷,是乙偷的?!倍≌f:“我沒有偷。”請根據(jù)這四人的答話判斷誰是盜竊者。*問題分析與算法設(shè)計假設(shè)A、B、C、D分別代表四個人,變量的值為1代表該人是竊賤。由題目已知:四人中僅有一名是竊賤,且這四個人中的每個人要么說真話,要么說假話,而由于甲、乙、丙三人都說了兩句話:“X沒偷,X偷了”,故不論該人是否說謊,他提到的兩人中必有一人是小偷。故在列條件表達(dá)式時,可以不關(guān)心誰說謊,誰說實話。這樣,可以列出下列條件表達(dá)式:甲說:”乙沒有偷,是丁偷的?!?B+D=1乙說:“我沒有偷,是丙偷有。” B+C=1丙說:“甲沒有偷,是

18、乙偷的?!?A+B=1丁說:“我沒有偷?!?A+B+C+D=1其中丁只說了一句話,無法判定其真假,表達(dá)式反映了四人中僅有一名是竊賤的條件。*程序與程序注釋#include<stdio.h>void main()inti,j,a4; for(i=0;i<4;i+) /*假定只有第i個人為竊賤*/ for(j=0;j<4;j+) /*將第i個人設(shè)置為1表示竊賤,其余為0*/if(j=i)aj=1;else aj=0; if(a3+a1=1&&a1+a2=1&&a0+a1=1) /*判斷條件是否成立*/ printf("The thi

19、ef is "); /*成立*/ for(j=0;j<=3;j+) /*輸出計算結(jié)果*/if(aj)printf("%c.",j+'A');printf("n"); *運行結(jié)果The thief is B. (乙為竊賤。) 69.魔術(shù)師的猜牌術(shù)(1)魔術(shù)師利用一副牌中的13張黑桃,預(yù)先將它們排好后迭在一起,牌面朝下。對觀眾說:我不看牌,只數(shù)數(shù)就可以猜到每張牌是什么,我大聲數(shù)數(shù),你們聽,不信?你們就看。魔術(shù)師將最上面的那張牌數(shù)為1,把它翻過來正好是黑桃A,將黑桃A放在桌子上,然后按順序從上到下數(shù)手上的余牌,第二次數(shù)1、2,將

20、第一張牌放在這迭牌的下面,將第二張牌翻過來,正好是黑桃2,也將它放在桌子上,第三次數(shù)1、2、3,將前面兩張依次放在這迭牌的下面,再翻第三張牌正好是黑桃3。這樣依次進(jìn)行將13張牌全翻出來,準(zhǔn)確無誤。問魔術(shù)師手中的牌原始順序是怎樣安排的?*問題分析與算法設(shè)計題目已經(jīng)將魔術(shù)師出牌的過程描述清楚,我們可以利用倒推的方法,很容易地推出原來牌的順序。人工倒推的方法是:在桌子上放13空盒子排成一圈,從1開始順序編號,將黑桃A放入1號盒子中,從下一個空盒子開始對空的盒子計數(shù),當(dāng)數(shù)到第二個空盒子時,將黑桃2放入空盒子中,然后再從下一個空盒子開始對空盒子計數(shù),順序放入3、4、5.,直到放入全部3張牌。注意在計數(shù)時

21、要跳過非空的盒子,只對空盒子計數(shù)。最后牌在盒子中的順序,就是魔術(shù)師手中原來牌的順序。這種人工的方法是行之有效的,計算機可以模擬求解。*程序與程序注釋#include<stdio.h>int a14;void main()inti,n,j=1; /*j:數(shù)組(盒子)下標(biāo),初始時為1號元素*/printf("The original order of cards is:"); for(i=1;i<=13;i+) /*i:要放入盒子中的牌的序號*/ n=1;do if(j>13) j=1; /*由于盒子構(gòu)成一個圈,j超過最后一個元素則指向1號元素*/ if

22、(aj) j+; /*跳過非空的盒子,不進(jìn)行計數(shù)*/ else if(n=i) aj=i; /*若數(shù)到第i個空盒子,則將牌放入空盒中*/ j+;n+; /*對空盒計數(shù),數(shù)組下標(biāo)指向下一個盒子*/ while(n<=i); /*控制空盒計數(shù)為i*/ for(i=1;i<=13;i+) /*輸出牌的排列順序*/printf("%d ",a);printf("n");*運行結(jié)果 The original order of cards is:1 8 2 5 10 3 12 11 9 4 7 6 1370.魔術(shù)師的猜牌術(shù)(2)魔術(shù)師再次表演,他將紅桃和

23、黑桃全部迭在一起,牌面朝下放在手中,對觀眾說:最上面一張是黑桃A,翻開后放在桌上。以后,從上至下每數(shù)兩張全依次放在最底下,第三張給觀眾看,便是黑桃2,放在桌上后再數(shù)兩張依次放在最底下,第三張給觀眾看,是黑桃3。如此下去,觀眾看到放在桌子上牌的順序是:黑桃 A 2 3 4 5 6 7 8 9 10 J Q K紅桃 A 2 3 4 5 6 7 8 9 10 J Q K問魔術(shù)師手中牌的原始順序是什么?*問題分析與算法設(shè)計本題可在上題的基礎(chǔ)上進(jìn)行編程,不同的在于計數(shù)的方法和牌的張數(shù),這些并不影響我們求解題目的思路,仍可按照倒推的方法,得到原來魔術(shù)師手中的牌的順序。*程序與程序注釋#include<

24、;stdio.h>int a27;void main()inti,n,j=1; a1=1; /*初始化第一張牌*/printf("The original order of cards is:(r:rad b:block):n");for(i=2;i<=26;i+) n=1;do if(j>26) j=1; /*超過最后一個元素則指向1號元素*/ if(aj) j+; /*跳過非空的盒子,不進(jìn)行計數(shù)*/else if(n=3) aj=i; /*若數(shù)到第3個空盒子,則將牌放入空盒中*/ j+; n+; /*對空盒計數(shù),數(shù)組下標(biāo)指向下一個盒子*/ while(

25、n<=3); /*控制空盒計數(shù)為3*/ for(i=1;i<=26;i+) /*輸出牌的排列順序*/ printf("%c",a>13? 'r':'b');printf("%d ",a>13? a-13:a);if(i=13) printf("n"); printf("n");*運行結(jié)果 The original order of cards is:(r:rad b:black): b1 r6 b10 b2 r12 r3 b3 b11 r9 b4 r7 b12

26、 b5 r4 r13 b6 b13 r11 b7 r5 r1 b8 r8 r10 b9 r275.10個小孩分糖果十個小孩圍成一圈分糖果,老師分給第一個小孩10塊,第二個小孩2塊,第三個小孩8塊,第四個小孩22塊,第五個小孩16塊,第六個小孩4塊,第七個小孩10塊,第八個小孩6塊,第九個小孩14塊,第十個小孩20塊。然后所有的小孩同時將手中的糖分一半給右邊的小孩;糖塊數(shù)為奇數(shù)的人可向老師要一塊。問經(jīng)過這樣幾次后大家手中的糖的塊數(shù)一樣多?每人各有多少塊糖?*問題分析與算法設(shè)計題目描述的分糖過程是一個機械的重復(fù)過程,編程算法完全可以按照描述的過程進(jìn)行模擬。*程序與程序注釋#include<s

27、tdio.h>void print(int s);int judge(int c);int j=0;void main() static int sweet10=10,2,8,22,16,4,10,6,14,20; /*初始化數(shù)組數(shù)據(jù)*/inti,t10,l;printf(" childn");printf(" round 1 2 3 4 5 6 7 8 9 10n");printf(".n"); print(sweet); /*輸出每個人手中糖的塊數(shù)*/ while(judge(sweet) /*若不滿足要求則繼續(xù)進(jìn)行循環(huán)*/

28、 for(i=0;i<10;i+) /*將每個人手中的糖分成一半*/ if(sweet%2=0) /*若為偶數(shù)則直接分出一半*/ t=sweet=sweet/2; else /*若為奇數(shù)則加1后再分出一半*/ t=sweet=(sweet+1)/2; for(l=0;l<9;l+) /*將分出的一半糖給右(后)邊的孩子*/sweetl+1=sweetl+1+tl;sweet0+=t9; print(sweet); /*輸出當(dāng)前每個孩子中手中的糖數(shù)*/ int judge(int c)inti; for(i=0;i<10;i+) /*判斷每個孩子手中的糖是否相同*/if(c0!

29、=c) return 1; /*不相同返回 1*/return 0;void print(int s) /*輸出數(shù)組中每個元素的值*/int k;printf(" %2d ",j+);for(k=0;k<10;k+) printf("%4d",sk);printf("n"); - 作者:huang01- 發(fā)布時間:2004-10-21 17:16:52- 5 76.小明買書小明假期同爸爸一起去書店,他選中了六本書,每本書的單價分別為:3.1,1.7,2,5.3,0.9和7.2。不巧的是,小明的爸爸只帶了十幾塊錢,為了讓小明過一個

30、愉快的假期,爸爸扔然同意買書,但提郵購一個要求,要小明從六本書中選出若干本,使得單價相加所得的和同10最接近。你能夠幫助小明解決這個問題嗎?*問題分析與算法設(shè)計分析題意,可將題目簡化為:從六個數(shù)中選出若干個求和,使得和與10的差值最小。題目中隱含兩個問題,其一是怎樣從六個數(shù)中選出若干個數(shù);其二是求與10的差。從六個數(shù)中選出若干個數(shù)實質(zhì)是從六個數(shù)中選出若干個進(jìn)行組合。每個數(shù)在組合過程中只有兩種情況:要么是選中參加求和,要么是沒選中不參加求和。這樣就可以使用六重循環(huán)對每個數(shù)是否參加求和進(jìn)行全部可能情況的組合。關(guān)于求與10的差值應(yīng)當(dāng)注意的是:差值的含義是指差的絕對值。例如:“9-10=-1"

31、;和"11-10=1",但9和11這兩者與10的差值都是1。若認(rèn)為”9“與”10的差值為-1就錯了。*程序與程序注釋#include<stdio.h>#include<math.h>void main()int d6,m,i,j;long b63,flag;float c6,min,x;printf("Please enter the prices of 6 books:"); for(i=0;i<6;i+) scanf("%f",&c); /*輸入六個浮點數(shù)*/ for(i=0,min=-1,d

32、0=0;d0<2;d0+) /*建立六個數(shù)的全部組合并處理*/ for(d1=0;d1<2;d1+) /*i:差值具有min組合的數(shù)量*/ for(d2=0;d2<2;d2+) /*min:與10的最小差值*/ for(d3=0;d3<2;d3+) /*d:組合時是否取該數(shù)的標(biāo)志*/ for(d4=0;d4<2;d4+) for(d5=0;d5<2;d5+) for(flag=0,x=0,j=5;j>=0;j-) /*flag:將六個數(shù)的組合用對應(yīng)的一個十進(jìn)制位表示 x:對應(yīng)六個數(shù)組合的和*/ x+=cj*dj; flag=flag*10+dj; x=

33、(x-10>0)? x-10:10-x); /*x: 組合的和與10的差*/if(min<0) min=x; /*對第一次計算出的差min進(jìn)行處理*/ bi+=flag; /*b:有相同的min的flag的數(shù)組 i:b數(shù)組的下標(biāo)*/ else if(min-x>1.e-6) /*對新的min的處理*/ min=x; b0=flag; i=1; else if(fabs(double)x-min)<1.e-6) bi+=flag; /*對相等min的處理*/ for(m=0;m<i;m+) /*輸出全部i個與10的差值均為min的組合*/ printf("

34、10(+ -)%.2f=",min);for(flag=bm,j=0;flag>0;j+,flag/=10) if(flag%10) /*將b中存的標(biāo)記flag還原為各個數(shù)的組合*/if(flag>1) printf("%.2f+",cj);elseprintf("%.2fn",cj); *運行結(jié)果 Please enter the prices of 6 books:3.1 1.7 2.0 5.3 0.9 7.2 10(+ -)0.10=2.00+0.90+7.20 10(+ -)0.10=1.70+2.00+5.30+0.90 10(+ -)0.10=3.10+1.70+5.30 *思考題可以看出,程序中求六個數(shù)所能產(chǎn)生全部組合的算法并不好,使用六重循環(huán)進(jìn)行處理使程序顯得不夠簡潔??梢栽O(shè)計出更通用、優(yōu)化的算法產(chǎn)生全部組合。6 77.波松瓦酒的分酒趣題

溫馨提示

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

評論

0/150

提交評論