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
新聞熱點
疑難解答
圖片精選