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

下載本文檔

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

文檔簡介

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

2、pj)int te mp=pi;Pi=PU;pj=temp;printf評委打分按順序:for(int m=0;m<10;m+) 顯示排序后結果printf("%d pm);for(int k=l;k<count-l;k+) 求出去掉首尾的平均分result+=pk;result/=count-2;return result;void main()printf("請輸入 10 組評分:nH);int p10;inti;for(i=0;i<10;i+) 輸入評分printff"輸入評委4打分:"J+l);scanf(”d“,&pi

3、);double result二Aver(p,10); /計算平均分printf(Hn平均分為5“2fn”,result);1. 1打魚還是曬網中國有句俗語叫“三天打魚兩天曬網。某人從1990年1月1日起開始"三天打魚兩天曬網,問這個人在以后的某一天中 是“打魚還是曬網。*問題分析與算法設計根據題意可以將解題過程分為三步:1)計算從1990年1月1日開始至指定日期共有多少天;2)由于“打魚和曬網的周期為5天,所以將計算出的天數用5去除;3)根 據余數判斷他是在“打魚還是在“曬網;若余數為1, 2, 3,則他是在“打魚否則是在"曬網在這三步中,關鍵是第一步。求從1990年1月

4、1日至指定日期有多少天,要判斷經歷年份中是否有閏年,二 月為29天,平年為28天。閏年的方法可以用偽語句描述如下:如果(年能被4除盡且不能被100除盡)或能被400除盡)則該年是閏年;否則不是閏年。C語言中判斷能否整除可以使用求余運算(即求模)*程序與程序注釋# include<stdio.h>int days(struct date day);struct dateint year;int mon th;int day;void main()struct date today,term;in tyearday,year,day;prin tf(HE nter year/month

5、/day:”);scanf("%d%d%d",&today.year,&today. month,&today.day);/* 輸入日期 */term.month=12;/*設置變量的初始值:月*/term, day二31;/*設置變量的初始值:0*/for(yearday=0,year=1990;year<today.year;year+)term.year=year;yearday+=days(term);/*計算從1990年至指定年的前一年共有多少天 */yearday+=days(today);/*in 上指定年中到指定日期的天數 */

6、day=yearday%5;/* 求 余數*/if(day>0&&day<4) printf("he was fishing at that day.n");/*打印結果 */elseprintf(“He was sleeping at that day.rT);int days(struct date day)staticintday_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,;inti,Ip;lp

7、=day.year%4=0&&day.year%100!=011 day.year%400=0;/*判定year為閏年還是平年,lp=0為平年,非0為閏年 */for(i=l;i<day.month;i+)/*計算本年中自1月1日起的天數*/day.day+=day_tablp;returnday.day;* 運行結果Enter year/month/day:1991 10 25He was fishing at day.Enter year/month/day:1992 10 25He was sleeping at day.Enter year/month/day:1

8、993 10 25He was sleeping at day212.”抓交通肇事犯一輛卡車違反交通規(guī)則,撞人后逃跑?,F場有三人目擊事件,但都沒有記 住車號,只記下車號的一些特征。甲說:牌照的前兩位數字是相同的;乙說:牌照的后兩位數字是相同的,但與前兩位不同;丙是數學家,他說: 四位的車號剛好是一個整數的平方。請根據以上線索求出車號。*問題分析與算法設計按照題目的要求造出一個前兩位數相同、后兩位數相同且相互間又不同的 整數,然后判斷該整數是否是另一個整數的平方。*程序與程序注釋#include<stdio.h>#in clude<ma thh>void main()in

9、ti,j,k,c;for(i=l;i<=9;i+)/*i:車號前二位的取值 */for(j=0;j<=9;j+)/*j:車號后二位的取值*/if(i!=j)/*判斷二位數字是否相異 */k=i*1000+i*100+j*10+j; /*計算出可能的整數*/for(c=31;c*c<k;c+);/*判斷該數 是否為另一整數的平方*/if(c*c=k) printf(HLorry-No. is %d.n,/k);/*若是,打印結果*/*運行結果Lorry _No.is 7744314.”怎樣存錢利最大假設銀行整存整取存款不同期限的月息利率分別為:0.63%期限=1年0.66%期限

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

11、8次,則到期時存款人應得到的本利合計為: 2000*(l+ratel)il*(l+rate2)i2*(l+rate3)i3*(l+rate5)i5*(l+rate8)i8 其中 rateN 為對 應存款年限的利率。根據題意還可得到以下限制條件:0v二i8v=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的組合,代入求本利的公式計算出最大值,就是最佳存

12、款方 案。*程序與程序注釋#include<stdio.h>#in clude<ma thh>void main()int i8,i5,i3,i2,il,n8,n53,n2nl;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+)il=20-8*i8-5*i5-3*i3-2*i2;term=20

13、00."0*pow(double)(l+0”0063T2),(double)*pow(double)(l+2*0”0063T2),(double)i2)*pow(double)(l+3*0”0069T2),(double)i3)*pow(double)(l+5*0”0075T2),(double)i5)*pow(double)(l+8*0."0084*12),(double)i8);/*計算到期時的本利合計*/if(term>max)max=term;nl=il;n2=i2; n3 二 i3; n5 二 i5; n8 二 i8;printff'For maxi

14、numprofit,he should so save his money in a bank:n“);printf("made fixed deposit for 8 year:%d timesrT,n8);printff'made fixed deposit for 5 year:%d timesrT,n5);printff'made fixed deposit for 3 year:%d timesrT,n3);printff'made fixed deposit for 2 year:%d timesn",n2);printff'ma

15、de fixed deposit for 1 year:%d timesn",nl);printf(HToal:%.2fn"/max);/*輸出存款方式*/*運行結果For maxinumprofit,he should so save his money in a bank:made fixed deposit for 8 year:Otimesmade fixed deposit for 5 year:4timesmade fixed deposit for 3 year:Otimesmade fixed deposit for 2 year:Otimesmade fi

16、xed deposit for 1 year:OtimesTotal:8841."01可見最佳的存款方案為連續(xù)四次存5年期。10/234.51 ”誰是竊賊公安人員審問四名竊賊嫌疑犯。已知,這四人當中僅有一名是竊賊,還知 道這四人中每人要么是誠實的,要么總是說謊的。在回答公安人員的問題中:甲說:"乙沒有偷,是丁偷的。”乙說:"我沒有偷,是丙便的。丙說:"甲沒有偷,是乙偷的?!倍≌f:"我沒有偷。請根據這四人的答話判斷誰是盜竊者。*問題分析與算法設計假設A、B、C、D分別代表四個人,變量的值為1代表該人是竊賤。由題目已知:四人中僅有一名是竊賤,且這四

17、個人中的每個人要么說真話,要么說假 話,而由于甲、乙、丙三人都說了兩句話:"X沒偷,X偷了,故不論該人是否說謊,他提到的兩人中必有一人是小 偷。故在列條件表達式時,可以不關心誰說謊,誰說實話。這樣,可以列出下 列條件表達式:甲說:乙沒有偷,是丁偷的。B+D二1乙說:"我沒有偷,是丙偷有。B+C=1丙說:"甲沒有偷,是乙偷的o "A+B=l丁說:"我沒有偷。“ A+B+C+X1其中丁只說了一句話,無法判定其真假,表達式反映了四人中僅有一名是 竊賤的條件。*程序與程序注釋#include<stdio.h>void main()inti,

18、j,a4;for(i=0;i<4;i+)/*假定只有第i個人為竊賤*/for(j=0;j<4;j+)/*將第i個人設置 為1表示竊賤,其余為0*/if(j=i)aj=l;else aj=O;if(a3+al=l&&al+a =l&&a0+al=l)/* 判斷條件是否成立 */printf("The thief is");/*成立*/for(j=0;j<=3;j+)/* 輸出計算結果 ViffaUDprintfCc.j+VAV);printf(Hn");* 運行結果The thief isB(乙為竊賤。)69 “魔術

19、師的猜牌術(1)魔術師利用一副牌中的13張黑桃,預先將它們排好后迭在一起,牌面朝 下。對觀眾說:我不看牌,只數數就可以猜到每張牌是什么,我大聲數數,你們聽,不 信?你們就看。魔術師將最上面的那張牌數為1,把它翻過來正好是黑桃A,將 黑桃A放在桌子上,然后按順序從上到下數手上的余牌,第二次數1、”2,將第一張牌放在這迭牌的下面,將第二張牌翻過來,正好是黑桃2, 也將它放在桌子上,第三次數1、”2、3,將前面兩張依次放在這迭牌的下面,再翻第三張牌正好是照桃3、”這樣依次進行將13張牌全翻出來,準確無誤。問魔術師手中的牌原始順序是怎樣安排的?*問題分析與算法設計題目已經將魔術師出牌的過程描述清楚,我

20、們可以利用倒推的方法,很容 易地推出原來牌的順序。人工倒推的方法是:在桌子上放13空盒子排成一圈,從1開始順序編號,將黑桃A放入1號盒 子中,從下一個空盒子開始對空的盒子計數,當數到第二個空盒子時,將黑桃2 放入空盒子中,然后再從下一個空盒子開始對空盒子計數,順序放入3、”4、5”,直到放入全部3張牌。注意在計數時要跳過非空的盒子,只對空盒子 計數。最后牌在盒子中的順序,就是魔術師手中原來牌的順序。這種人工的方法是行之有效的,計算機可以模擬求解。*程序與程序注釋#include<stdio.h>int a14;void main()inti,n,j=l;/*j:數組(盒子)下標,初

21、始時為1號元素*/printff'The original order of cards is:");for(i=l;i<=13;i+)/*i:要放入盒子中的牌的序號*/n=l;doif(j>13)j=l;/*由于盒子構成一個圈,j超過最后一個元素則指向1號元素*/if(aj) j+;/*跳過非空的盒子,不進行計數*/else if(n=i) aj=i;/*若數到第i 個空盒子,則將牌放入空盒中j+;n+;/*對空盒計數,數組下標指向下一個盒子*/while(nv=i);/*控制空盒 計數為i*/for(i=l;i<=13;i+)/*輸出牌的排列順序*/pr

22、intf(H%d ”,a);printfCWn");* 運行結果The original order of cards is:94761370 “魔術師的猜牌術(2)魔術師再次表演,他將紅桃和黑桃全部迭在一起,牌面朝下放在手中,對 觀眾說:最上面一張是黑桃A,翻開后放在桌上。以后,從上至下每數兩張全依次 放在最底下,第三張給觀眾看,便是黑桃2,放在桌上后再數兩張依次放在最底 下,第三張給觀眾看,是黑桃3。”如此下去,觀眾看到放在桌子上牌的順序是:黑桃A10JQK紅桃A10JQK問魔術師手中牌的原始順序是什么?*問題分析與算法設計本題可在上題的基礎上進行編程,不同的在于計數的方法和牌的

23、張數,這 些并不影響我們求解題目的思路,仍可按照倒推的方法,得到原來魔術師手中 的牌的順序。*程序與程序注釋# include<stdio.h>int a27;al=l;/*初始化第一張牌*/printff'The original order of cards is:(r:rad b:block):n“);for(i=2;i<=26;i+)n=l;doif(j>26) j=l;/*超過最后一個元素則指向1號元素*/if(aU)j+;/*跳過非空的盒 子,不進行計數*/elseif(n=3) aU=i;/*若數到第3個空盒子,則將牌放入空盒中j+;n+;/*對空

24、盒計數,數組下標指向下一個盒子*/while(nv=3);/*控制空盒計數為 3*/for(i=l;i<=26;i+)/*輸出牌的排列順序*/pnntf(H%c,/a>13?Vr,:VbV);printf(H%d "/a>13? a-13:a);if(i=13) printf(“n“);printf(”n”);*運行結果The original order of cards is:(r:rad b:black):blr6bl0b2rl2r3bllr9b4r7bl2b5r4rl3b6bl3rllb7r5rlb8rl0b9r275."10個小孩分糖果十個小孩圍

25、成一圈分糖果,老師分給第一個小孩10塊,第二個小孩2塊, 第三個小孩8塊,第四個小孩22塊,第五個小孩16塊,第六個小孩4塊,第 七個小孩10塊,第八個小孩6塊,第九個小孩14塊,第十個小孩20塊。然后所有的小孩同時將手中的糖分一半給右邊的小孩;糖塊數為奇數的人 可向老師要一塊。問經過這樣幾次后大家手中的糖的塊數一樣多?每人各有多 少塊糖?*問題分析與算法設計題目描述的分糖過程是一個機械的重復過程,編程算法完全可以按照描述 的過程進行模擬。*程序與程序注釋#include<stdio.h>void print(int s);int judge(int c);int j=0;void

26、 main()staticintsweet10=10,2,8,22,16,4,10,6,14,20;/*初始化數組數據*/inti,t10,l;printf(,childn");printfC' round910n");printf("n");print(sweet);/*輸出每個人手中糖的塊數*/while(judge(sweet)/*若不滿足要求則繼續(xù)進行循環(huán)*/for(i=0;i<10;i+)/*將每個人手中的糖分成一半*/if(sweet%2=0)/* 若為偶數則直接分出一半 */t=sweet=sweet/2;else/*若為奇數

27、則加1后再分出一半*/t=sweet=(sweet+l)/2;for(l=0;l<9;l+)/*將分出的一半糖給右(后)邊的孩子 */sweetl+l=sweetl+l+tl;sweet0+=t9;print(sweet);/*輸出當前每個孩子中手中的糖數*/int judge(int c)inti;for(i=0;i<10;i+)/*判斷每個孩子手中的糖是否相同*/if(cO!=c) return 1;/*不 相同返回1*/return 0;void printfint s)/*輸出數組中每個元素的值*/int k;printf("%2d ”,j+);for(k=0;k

28、<10;k+)printf("%4d",sk);printf(Hnn);huangOl“發(fā)布時間:2004-10-21 17:16:52 576.“小明買書小明假期同爸爸一起去書店,他選中了六本書,每本書的單價分別為:3."1,1.7, 2,5”3,0."9 和7“2。不巧的是,小明的爸爸只帶了十幾塊錢,為了讓小明過一個愉快的假 期,爸爸扔然同意買書,但提郵購一個要求,要小明從六本書中選出若干本, 使得單價相加所得的和同10最接近。你能夠幫助小明解決這個問題嗎?*問題分析與算法設計分析題意,可將題目簡化為:從六個數中選出若干個求和,使得和與10的差

29、值最小。題目中隱含兩個問題,其一是怎樣從六個數中選出若干個數;其二是求與 10的差。從六個數中選出若干個數實質是從六個數中選出若干個進行組合。每個數 在組合過程中只有兩種情況:要么是選中參加求和,要么是沒選中不參加求和。這樣就可以使用六重循壞對每個數是否參加求和進行全部可能情況的組 合。關于求與10的差值應當注意的是:差值的含義是指差的絕對值。例如:/z9-10=-ln和“1110二1“,但9和11這兩者與10的差值都是1?!比粽J為9與T0的差值為就錯了。*程序與程序注釋#include<stdio.h>#in clude<math.h>void main()int d

30、6,mjj;long b63,flag;float c6,min,x;printff'Please enter the prices of 6 books:for(i=0;i<6;i+)scanf("%f",&c);/* 輸入六個浮點數 */for(i=0,min=-l,d0=0;d0<2;d0+)/* 建立六個數的全部組合并處理*/ for(dl=0;dl<2;dl+)/*i:差值具有min組合的數量*/for(d2=0;d2<2;d2+)/*min:與 10 的最小差值*/for(d3=0;d3<2;d3+)/*d:組合時是

31、否取該數的標志*/for(d4=0;d4<2;d4+)for(d5=0;d5 <2;d5+)for(flag=0,x=0,j=5;j>=0;j-)/*flag:將六個數的組合用對應的一個十進制位表示x:對應六個數組合的和 */x+=cj*dj;flag=flag*10+dj;x=(x-10>0)?x-10:10-x);/*x:組合的和與10的差*/if(min<0)min=x;/*對第一次計算出的差min進行處理*/bi+=flag;/*b:有相同的min的flag的數組i:b數組的下標 */elseif(min-x>l."e-6)/*對新的 mi

32、n 的處理*/min=x; b0=flag; i=l;else if(fabs(double)x- min)<1. He-6)bi+二flag;/*對相等 min 的處理*/for(m=0;m<i;m+)/*輸出全部i個與10的差值均為min的組合*/printf(,10(+ for(flag=bm,j=0;flag>0;j+,flag/=10)if(flag%10)/*將b中存的標記flag還原為各個數的組合*/if(flag>l)printf(,%.2f+,cj);elseprintf(“.2fn”,cj);*運行結果Please enter the prices of 6 books:3."11:'72:'05."3O."97.H210(+ -)0.H10=2. "00+0”90+7."2010(+ -)0.H10=l."70+2”00+5“30+0."9010(+ -)0.H10=3. "10+l.n70+5. "30*思考題可以看出,程序中求六個數所能產生全部組合的算法并不好,使用六重循 環(huán)進行處理使程序顯得不夠簡潔??梢栽O計出更通用、優(yōu)化的算法產生全部組 合。6.77 “波松瓦酒的分酒趣題法國著名數學家波瓦松

溫馨提示

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

評論

0/150

提交評論