1. (3’)結果填空
假設有兩種微生物 X 和 Y
X出生后每隔3分鐘分裂一次(數目加倍),Y出生后每隔2分鐘分裂一次(數目加倍)。
一個新出生的X,半分鐘之后吃掉1個Y,并且,從此開始,每隔1分鐘吃1個Y。
現在已知有新出生的 X=10, Y=89,求60分鐘后Y的數目。
如果X=10,Y=90 呢?
本題的要求就是寫出這兩種初始條件下,60分鐘后Y的數目。
題目的結果令你震驚嗎?這不是簡單的數字游戲!真實的生物圈有著同樣脆弱的性質!也許因為你消滅的那只 Y 就是最終導致 Y 種群滅絕的最后一根稻草!
【分析】以0.5分鐘為一個單位時間計算
源代碼:
#include <stdio.h>int main(){ int x,y; int i; //記錄0.5分鐘數 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) //設此步意在說明如果y<0 ,這說明全部的Y已經死亡,循環不再繼續進行 break; PRintf("%ds: x:%d,y:%d/n",i,x,y); } } return 0;}程序截圖:

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