国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

2012年第三屆藍橋杯C/C++組真題訓練(一)(2017.2.6)

2019-11-11 06:38:55
字體:
來源:轉載
供稿:網友

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 石城县| 淮滨县| 温宿县| 忻城县| 乌拉特后旗| 古田县| 二手房| 兴仁县| 大同市| 鹤峰县| 承德县| 开原市| 收藏| 晋宁县| 汉川市| 衡山县| 错那县| 茂名市| 湘阴县| 庆安县| 军事| 南溪县| 新余市| 连南| 合川市| 兴城市| 沂水县| 汉阴县| 台州市| 盐源县| 宜兰市| 泰兴市| 青龙| 通化县| 阳曲县| 新巴尔虎左旗| 孟津县| 泌阳县| 霍林郭勒市| 永仁县| 乐陵市|