1. (3’)結(jié)果填空
假設(shè)有兩種微生物 X 和 Y
X出生后每隔3分鐘分裂一次(數(shù)目加倍),Y出生后每隔2分鐘分裂一次(數(shù)目加倍)。
一個(gè)新出生的X,半分鐘之后吃掉1個(gè)Y,并且,從此開(kāi)始,每隔1分鐘吃1個(gè)Y。
現(xiàn)在已知有新出生的 X=10, Y=89,求60分鐘后Y的數(shù)目。
如果X=10,Y=90 呢?
本題的要求就是寫出這兩種初始條件下,60分鐘后Y的數(shù)目。
題目的結(jié)果令你震驚嗎?這不是簡(jiǎn)單的數(shù)字游戲!真實(shí)的生物圈有著同樣脆弱的性質(zhì)!也許因?yàn)槟阆麥绲哪侵?Y 就是最終導(dǎo)致 Y 種群滅絕的最后一根稻草!
【分析】以0.5分鐘為一個(gè)單位時(shí)間計(jì)算
源代碼:
#include <stdio.h>int main(){ int x,y; int i; //記錄0.5分鐘數(shù) while(scanf("%d %d",&x,&y)!=EOF) { for(i=1;i<=120;i++) { if(i%6==0) x*=2; if(i%4==0) y*=2; if(i%2==1) y-=x; if(y<0) //設(shè)此步意在說(shuō)明如果y<0 ,這說(shuō)明全部的Y已經(jīng)死亡,循環(huán)不再繼續(xù)進(jìn)行 break; PRintf("%ds: x:%d,y:%d/n",i,x,y); } } return 0;}程序截圖:

【答案】0 94371840
2. (4’)結(jié)果填空
福爾摩斯到某古堡探險(xiǎn),看到門上寫著一個(gè)奇怪的算式:
ABCDE * ? = EDCBA
他對(duì)華生說(shuō):“ABCDE應(yīng)該代表不同的數(shù)字,問(wèn)號(hào)也代表某個(gè)數(shù)字!”
華生:“我猜也是!”
于是,兩人沉默了好久,還是沒(méi)有算出合適的結(jié)果來(lái)。
請(qǐng)你利用計(jì)算機(jī)的優(yōu)勢(shì),找到破解的答案。
把 ABCDE 所代表的數(shù)字寫出來(lái)。
【分析】算法核心:求數(shù)的逆序數(shù)、數(shù)位分離與查重
源代碼:
法一:暴力枚舉
#include <stdio.h> int main() { int a,b,c,d,e,f; for(a=1;a<10;a++) //第一位數(shù)不能為0 { for(b=0;b<10;b++) { if(b==a) //從第二位開(kāi)始,數(shù)字取值范圍為0~9,且互不相同 continue; for(c=0;c<10;c++) { if(c==a||c==b) continue; for(d=0;d<10;d++) { if(d==a||d==b||d==c) continue; for(e=0;e<10;e++) { if(e==a||e==b||e==c||e==d) continue; for(f=2;f<10;f++) //由于?代表的數(shù)字不能為0且左右等式兩個(gè)數(shù)不可能相同,故取值范圍為2~9 { if((a*10000+b*1000+c*100+d*10+e)*f==(e*10000+d*1000+c*100+b*10+a)) printf("%d%d%d%d%d/n",a,b,c,d,e); } } } } } } return 0; }法二:根據(jù)原式特點(diǎn),進(jìn)一步縮小符合條件的數(shù)的范圍至 10234~50000(各位數(shù)字不同,?處代表的數(shù)字最小為2,EDCBA為5位數(shù))
#include <stdio.h>#define maxn 6int a[maxn]; //保存分離出的個(gè)位數(shù) int main(){ int i,j,k,l; int t,wei,rnum,flag; for(i=10234;i<50000;i++) //ABCDE范圍 { j=0; t=i; wei=10000; rnum=0; //數(shù)的逆序數(shù) flag=1; //判重標(biāo)記 while(t) //從后往前分離各位數(shù) { a[j]=t%10; rnum+=(a[j]*wei); t/=10; wei/=10; j++; } for(k=0;k<j;k++) //發(fā)現(xiàn)分離出的個(gè)位數(shù)有重復(fù),flag置0,不再進(jìn)行后續(xù)操作 { for(l=k+1;l<j;l++) { if(a[k]==a[l]) { flag=0; break; } } } if(flag==1) { for(k=2;k<=9;k++) //遍歷? 發(fā)現(xiàn)ABCDE*?=EDCBA時(shí)則輸出i { if(rnum==i*k) printf("%d/n",i); } } } return 0;}程序截圖:
【答案】21978
3. (5’)結(jié)果填空
有一群海盜(不多于20人),在船上比拼酒量。過(guò)程如下:打開(kāi)一瓶酒,所有在場(chǎng)的人平分喝下,有幾個(gè)人倒下了。再打開(kāi)一瓶酒平分,又有倒下的,再次重復(fù)...... 直到開(kāi)了第4瓶酒,坐著的已經(jīng)所剩無(wú)幾,海盜船長(zhǎng)也在其中。當(dāng)?shù)?瓶酒平分喝下后,大家都倒下了。
等船長(zhǎng)醒來(lái),發(fā)現(xiàn)海盜船擱淺了。他在航海日志中寫到:“......昨天,我正好喝了一瓶.......奉勸大家,開(kāi)船不喝酒,喝酒別開(kāi)船......”
請(qǐng)你根據(jù)這些信息,推斷開(kāi)始有多少人,每一輪喝下來(lái)還剩多少人。
如果有多個(gè)可能的答案,請(qǐng)列出所有答案,每個(gè)答案占一行。
格式是:人數(shù),人數(shù),...
例如,有一種可能是:20,5,4,2,0
【分析】從船長(zhǎng)入手,平分喝了4輪酒后倒下,且正好喝了1瓶。設(shè)4輪分別有i j k l個(gè)人,且i>j>k>l,因此通過(guò)枚舉,若1.0/i+1.0/j+1.0/k+1.0/l=1時(shí),符合條件(注意數(shù)值類型轉(zhuǎn)換)
源代碼:#include <stdio.h>int main(){ int i,j,k,l; double sum=0; for(i=2;i<=20;i++) { for(j=2;j<i;j++) { for(k=2;k<j;k++) { for(l=2;l<k;l++) { sum=1.0/i+1.0/j+1.0/k+1.0/l; if(sum==1) printf("%d,%d,%d,%d,0/n",i,j,k,l); } } } } return 0;}程序截圖:
【答案】12, 6, 4, 2, 0
15, 10, 3, 2, 0
18, 9, 3, 2, 0
20, 5, 4, 2, 0
4. (8’)結(jié)果填空
某電視臺(tái)舉辦了低碳生活大獎(jiǎng)賽。題目的計(jì)分規(guī)則相當(dāng)奇怪:
每位選手需要回答10個(gè)問(wèn)題(其編號(hào)為1到10),越后面越有難度。答對(duì)的,當(dāng)前分?jǐn)?shù)翻倍;答錯(cuò)了則扣掉與題號(hào)相同的分?jǐn)?shù)(選手必須回答問(wèn)題,不回答按錯(cuò)誤處理)。
每位選手都有一個(gè)起步的分?jǐn)?shù)為10分。
某獲勝選手最終得分剛好是100分,如果不讓你看比賽過(guò)程,你能推斷出他(她)哪個(gè)題目答對(duì)了,哪個(gè)題目答錯(cuò)了嗎?
如果把答對(duì)的記為1,答錯(cuò)的記為0,則10個(gè)題目的回答情況可以用僅含有1和0的串來(lái)表示。例如:0010110011 就是可能的情況。
你的任務(wù)是算出所有可能情況。每個(gè)答案占一行。
【分析】串的相關(guān)操作
源代碼:
法一:暴力枚舉(串中各個(gè)元素為0或1,枚舉之)
#include <stdio.h>#define maxlen 11int main(){ int i,j,sc; char i1,j1,k1,l1,m1; char i2,j2,k2,l2,m2; char str[maxlen]; for(i1='0';i1<'2';i1++) { for(j1='0';j1<'2';j1++) { for(k1='0';k1<'2';k1++) { for(l1='0';l1<'2';l1++) { for(m1='0';m1<'2';m1++) { for(i2='0';i2<'2';i2++) { for(j2='0';j2<'2';j2++) { for(k2='0';k2<'2';k2++) { for(l2='0';l2<'2';l2++) { for(m2='0';m2<'2';m2++) { j=0; str[j++]=i1,str[j++]=j1,str[j++]=k1,str[j++]=l1,str[j++]=m1,str[j++]=i2,str[j++]=j2,str[j++]=k2,str[j++]=l2,str[j++]=m2; str[j]='/0'; sc=10; for(i=0;i<10;i++) { if(str[i]=='0') sc-=(i+1); else sc*=2; } if(sc==100) printf("%s/n",str); } } } } } } } } } } return 0;}法二:遞歸遍歷(從后往前,掌握遞歸思想)
#include <stdio.h>void f(char s[],int n,int score) //score為完成第n題之后的分?jǐn)?shù){ if(n==0) //回到比賽開(kāi)始時(shí),得分為10,結(jié)束遞歸,輸出串 { if(score==10) puts(s); return; } s[n-1] = '0'; //第n題答錯(cuò) f(s,n-1,score+n); if(score%2==0) //第n題答對(duì) { s[n-1]='1'; f(s,n-1,score/2); }}int main(){ char s[10]; //初始化串 s[10]='/0'; f(s,10,100); //初始情況:已答完第10題,已得100分,從后往前計(jì)算 return 0;}程序截圖:
【答案】0010110011 0111010000 1011010000
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注