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

首頁(yè) > 編程 > C++ > 正文

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

2019-11-11 05:26:57
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

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


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 靖宇县| 武定县| 百色市| 惠州市| 安乡县| 晋江市| 金华市| 增城市| 瑞安市| 米易县| 筠连县| 上饶县| 中山市| 麻栗坡县| 海南省| 弥渡县| 江源县| 乐都县| 巢湖市| 宁化县| 荔波县| 雷波县| 孙吴县| 都兰县| 邛崃市| 吉木萨尔县| 开原市| 京山县| 红安县| 彭州市| 阳春市| 许昌市| 九江县| 额济纳旗| 邳州市| 内江市| 平陆县| 益阳市| 益阳市| 揭西县| 昌乐县|