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

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

2013年第四屆藍(lán)橋杯C/C++B組真題訓(xùn)練(一,2017.3.3)

2019-11-06 07:58:54
字體:
供稿:網(wǎng)友
1. (4')高斯日記    大數(shù)學(xué)家高斯有個(gè)好習(xí)慣:無(wú)論如何都要記日記。    他的日記有個(gè)與眾不同的地方,他從不注明年月日,而是用一個(gè)整數(shù)代替,比如:4210    后來人們知道,那個(gè)整數(shù)就是日期,它表示那一天是高斯出生后的第幾天。這或許也是個(gè)好習(xí)慣,它時(shí)時(shí)刻刻提醒著主人:日子又過去一天,還有多少時(shí)光可以用于浪費(fèi)呢?    高斯出生于:1777年4月30日。        在高斯發(fā)現(xiàn)的一個(gè)重要定理的日記上標(biāo)注著:5343,因此可算出那天是:1791年12月15日。    高斯獲得博士學(xué)位的那天日記上標(biāo)著:8113       請(qǐng)你算出高斯獲得博士學(xué)位的年月日。提交答案的格式是:yyyy-mm-dd, 例如:1980-03-21請(qǐng)嚴(yán)格按照格式,通過瀏覽器提交答案。

注意:只提交這個(gè)日期,不要寫其它附加內(nèi)容,比如:說明性的文字。

【分析】趣味日期問題。這里要注意出生當(dāng)天記為第一天

源代碼:

#include <stdio.h>void fun(int y,int m,int d,int days){	int i,t;	int month[12]={31,28,31,30,31,30,31,31,30,31,30,31};	t=246;                         //1777年剩余天數(shù) 出生當(dāng)天為第一天 	y++,m=1,d=1; 	while(t<days)	{		if((y%4==0 && y%100!=0) || (y%400==0))			month[1]=29;		else			month[1]=28;		if(m<12)		{			if(days-t<=month[m-1])			{				d=(days-t);				break;			}			else			{				t+=month[m-1];				m++;				d=1;			}		}		else if(m==12)		{			if(days-t<=month[m-1])			{				d=(days-t);				break;				}			else			{				t+=month[m-1];				y++;				m=1;				d=1;			}		}	}	PRintf("%04d-%02d-%02d/n",y,m,d);} int main(){	int y=1777;	int m=4;	int d=30;	int days;	while(scanf("%d",&days)!=EOF)		fun(y,m,d,days);		return 0;}程序截圖:

【答案】1799-07-16

2. (5')馬虎的算式    小明是個(gè)急性子,上小學(xué)的時(shí)候經(jīng)常把老師寫在黑板上的題目抄錯(cuò)了。    有一次,老師出的題目是:36 x 495 = ?    他卻給抄成了:396 x 45 = ?    但結(jié)果卻很戲劇性,他的答案竟然是對(duì)的!!    因?yàn)?36 * 495 = 396 * 45 = 17820    類似這樣的巧合情況可能還有很多,比如:27 * 594 = 297 * 54    假設(shè) a b c d e 代表1~9不同的5個(gè)數(shù)字(注意是各不相同的數(shù)字,且不含0)    能滿足形如: ab * cde = adb * ce 這樣的算式一共有多少種呢?請(qǐng)你利用計(jì)算機(jī)的優(yōu)勢(shì)尋找所有的可能,并回答不同算式的種類數(shù)。滿足乘法交換律的算式計(jì)為不同的種類,所以答案肯定是個(gè)偶數(shù)。答案直接通過瀏覽器提交。注意:只提交一個(gè)表示最終統(tǒng)計(jì)種類數(shù)的數(shù)字,不要提交解答過程或其它多余的內(nèi)容。

【分析】循環(huán)+暴力枚舉(或結(jié)合全排列知識(shí)求解)

源代碼:

#include <stdio.h>int Judge(int a[],int n)                   //判斷abcde 5個(gè)數(shù)是否有重復(fù){	int i,j;	int flag=1;	for(i=0;i<n;i++)	{		for(j=i+1;j<n;j++)		{			if(a[i]==a[j])			{				flag=0;				break;			}		}	}	return flag;}int main(){	int a[5];	int left,right;	int count=0;	for(a[0]=1;a[0]<=9;a[0]++)	{		for(a[1]=1;a[1]<=9;a[1]++)		{			for(a[2]=1;a[2]<=9;a[2]++)			{				for(a[3]=1;a[3]<=9;a[3]++)				{					for(a[4]=1;a[4]<=9;a[4]++)					{						left=(a[0]*10+a[1])*(a[2]*100+a[3]*10+a[4]);						right=(a[0]*100+a[3]*10+a[1])*(a[2]*10+a[4]);						if(left==right && Judge(a,5))						{							//printf("%d%d*%d%d%d=%d%d%d*%d%d/n",a[0],a[1],a[2],a[3],a[4],a[0],a[3],a[1],a[2],a[4]);							count++;						}									}				}			}		}	} 	printf("%d/n",count);	return 0;}程序截圖:

【答案】142

3. (8')第39級(jí)臺(tái)階

    小明剛剛看完電影《第39級(jí)臺(tái)階》,離開電影院的時(shí)候,他數(shù)了數(shù)礼堂前的臺(tái)階數(shù),恰好是39級(jí)!    站在臺(tái)階前,他突然又想著一個(gè)問題:    如果我每一步只能邁上1個(gè)或2個(gè)臺(tái)階。先邁左腳,然后左右交替,最后一步是邁右腳,也就是說一共要走偶數(shù)步。那么,上完39級(jí)臺(tái)階,有多少種不同的上法呢?    請(qǐng)你利用計(jì)算機(jī)的優(yōu)勢(shì),幫助小明尋找答案。要求提交的是一個(gè)整數(shù)。注意:不要提交解答過程,或其它的輔助說明文字。

【分析】考慮步數(shù)的“N階樓梯上樓問題”+遞歸思想的運(yùn)用

        (參考)這個(gè)程序不需要糾結(jié)在左腳和右腳的問題上,從中抽象出限制條件:一共走的步數(shù)是偶數(shù);

        我們可以通過遞歸來實(shí)現(xiàn),對(duì)每次遞歸的結(jié)果進(jìn)行判斷:如果走過的臺(tái)階數(shù)為39則結(jié)束遞歸,判斷走的步數(shù)是否為偶數(shù),為偶數(shù)則方案數(shù)+1 

        要說明stair可能出現(xiàn)小于0的情況,當(dāng)最后只剩了一個(gè)臺(tái)階,但是小明想要跨兩步的時(shí)候,這樣是不可能的,也就是說他只能跨一步,兩步是不可能出現(xiàn)的,因此也不可能是符合條件的走法。這種遞歸的效果如下圖:

        這個(gè)二叉樹(本算法并不涉及二叉樹知識(shí),只是通過概念來理解)的每個(gè)葉子節(jié)點(diǎn)都是一種情況:

        我們將每一個(gè)節(jié)點(diǎn)稱為(x,y)

        葉子節(jié)點(diǎn)分為兩種情況:x為-1和x為0,x為-1的情況在現(xiàn)實(shí)中不可能發(fā)生,所以不予以考慮;

        我們對(duì)每一種x為0的情況都進(jìn)行判斷,如果y的值為偶數(shù),則方案數(shù)加1。

源代碼:

#include <stdio.h>long count=0;                         //count記錄方案總數(shù) void dfs(int stair,int step)          //stari用于表示剩余的臺(tái)階數(shù),當(dāng)?shù)扔?時(shí)停止遞歸{	int i;                            //step是走過的步數(shù),用來判斷是否是偶數(shù),是否符合要求    if(sum<0)		return;     if(step%2 == 0 && stair== 0)      //如果臺(tái)階全部走完而且步數(shù)為偶數(shù),則方案數(shù)+1       {            count++;         return;        }        for(i=1;i<=2;i++)                 //下一步可有走一步或者兩步,遞歸分析           dfs(stair-i,step+1);    }int main()    {        dfs(39,0);    printf("%d/n",count);      return 0;    }程序截圖:

【答案】51167078

※4. (12’)黃金連分?jǐn)?shù)    黃金分割數(shù)0.61803... 是個(gè)無(wú)理數(shù),這個(gè)常數(shù)十分重要,在許多工程問題中會(huì)出現(xiàn)。有時(shí)需要把這個(gè)數(shù)字求得很精確。    對(duì)于某些精密工程,常數(shù)的精度很重要。也許你聽說過哈勃太空望遠(yuǎn)鏡,它首次升空后就發(fā)現(xiàn)了一處人工加工錯(cuò)誤,對(duì)那樣一個(gè)龐然大物,其實(shí)只是鏡面加工時(shí)有比頭發(fā)絲還細(xì)許多倍的一處錯(cuò)誤而已,卻使它成了“近視眼”!!    言歸正傳,我們?nèi)绾吻蟮命S金分割數(shù)的盡可能精確的值呢?有許多方法。    比較簡(jiǎn)單的一種是用連分?jǐn)?shù):                  1    黃金數(shù) = ---------------------                        1             1 + -----------------                          1                 1 + -------------                            1                     1 + ---------                          1 + ...    這個(gè)連分?jǐn)?shù)計(jì)算的“層數(shù)”越多,它的值越接近黃金分割數(shù)。    請(qǐng)你利用這一特性,求出黃金分割數(shù)的足夠精確值,要求四舍五入到小數(shù)點(diǎn)后100位。    小數(shù)點(diǎn)后3位的值為:0.618    小數(shù)點(diǎn)后4位的值為:0.6180    小數(shù)點(diǎn)后5位的值為:0.61803    小數(shù)點(diǎn)后7位的值為:0.6180340   (注意尾部的0,不能忽略)你的任務(wù)是:寫出精確到小數(shù)點(diǎn)后100位精度的黃金分割值。注意:尾數(shù)的四舍五入! 尾數(shù)是0也要保留!顯然答案是一個(gè)小數(shù),其小數(shù)點(diǎn)后有100位數(shù)字,請(qǐng)通過瀏覽器直接提交該數(shù)字。注意:不要提交解答過程,或其它輔助說明類的內(nèi)容。

【分析】黃金分割數(shù)與斐波那契數(shù)有關(guān),實(shí)際上是相鄰兩個(gè)斐波那契數(shù)的商。對(duì)于小數(shù)點(diǎn)后100位精度,可用模擬手算除法實(shí)現(xiàn)。但是注意這里的精確度可能不夠。

源代碼:

#include <stdio.h>int main(){	int i,ans;	long long int fib[51];	long long int x,y;	fib[0]=0,fib[1]=1;	for(i=2;i<=51;i++)		fib[i]=fib[i-1]+fib[i-2];	x=fib[48],y=fib[49];	printf("x=%lld y=%lld/n",x,y);	for(i=0;i<=100;i++)                //模擬除法的過程,每次輸出小數(shù)點(diǎn)后的第i位 	{		ans=x/y;		x=(x%y)*10;		printf("%d",ans);		if(i==0)			printf(".");	}	printf("/n");	return 0;}程序截圖:

附:模擬筆算除法的實(shí)現(xiàn):

源代碼:

#include <stdio.h>void fun(long long int x,long long int y,int digit){	int i;	long long int ans;	for(i=0;i<=digit;i++)            //精確到第digit位,逐位打印結(jié)果 	{		ans=x/y;		x=(x%y)*10;		printf("%lld",ans);		if(i==0)			printf(".");	}	printf("/n");}int main(){	long long int m,n;	int digit; 	while(scanf("%lld %lld %d",&m,&n,&digit)!=EOF)		fun(m,n,digit);	return 0;}程序截圖:

5. (5')前綴判斷

    如下的代碼判斷 needle_start指向的串是否為haystack_start指向的串的前綴,如不是,則返回NULL。    比如:"abcd1234" 就包含了 "abc" 為前綴char* prefix(char* haystack_start, char* needle_start){char* haystack = haystack_start;char* needle = needle_start;while(*haystack && *needle){if(______________________________) return NULL;  //填空位置}if(*needle) return NULL;return haystack_start;}請(qǐng)分析代碼邏輯,并推測(cè)劃線處的代碼,通過網(wǎng)頁(yè)提交。注意:僅把缺少的代碼作為答案,千萬(wàn)不要填寫多余的代碼、符號(hào)或說明文字!!

【分析】子串的判斷

填空后代碼:

#include <stdio.h>#include <string.h>#define maxlen 1010char* prefix(char* haystack_start, char* needle_start){	char* haystack = haystack_start;	char* needle = needle_start;	while(*haystack && *needle)	{		if(*(haystack++)!=*(needle++)) return NULL;  //填空位置  如果對(duì)應(yīng)位置上s1串的字符與s2串的字符不同,則不滿足題意 	}	if(*needle)                                      //s2串比s1串長(zhǎng),則不滿足題意 		return NULL;	return haystack_start;}int main()    {	char s1[maxlen],s2[maxlen];                      //輸入s1 s2兩串,題意即判斷s2串是否是s1串的子串 	while(gets(s1)!=NULL)                            //如果是則打印s1串 	{		gets(s2);		printf("%s/n",prefix(s1,s2));	}	return 0;}程序截圖:

【答案】*(haystack++)!=*(needle++)

6. (7')三部排序

    一般的排序有許多經(jīng)典算法,如快速排序、希爾排序等。    但實(shí)際應(yīng)用時(shí),經(jīng)常會(huì)或多或少有一些特殊的要求。我們沒必要套用那些經(jīng)典算法,可以根據(jù)實(shí)際情況建立更好的解法。    比如,對(duì)一個(gè)整型數(shù)組中的數(shù)字進(jìn)行分類排序:    使得負(fù)數(shù)都靠左端,正數(shù)都靠右端,0在中部。注意問題的特點(diǎn)是:負(fù)數(shù)區(qū)域和正數(shù)區(qū)域內(nèi)并不要求有序。可以利用這個(gè)特點(diǎn)通過1次線性掃描就結(jié)束戰(zhàn)斗!!    以下的程序?qū)崿F(xiàn)了該目標(biāo)。    其中x指向待排序的整型數(shù)組,len是數(shù)組的長(zhǎng)度。void sort3p(int* x, int len){int p = 0;int left = 0;int right = len-1;while(p<=right){if(x[p]<0){int t = x[left];x[left] = x[p];x[p] = t;left++;p++;}else if(x[p]>0){int t = x[right];x[right] = x[p];x[p] = t;right--; }else{__________________________;  //填空位置}}}   如果給定數(shù)組:   25,18,-2,0,16,-5,33,21,0,19,-16,25,-3,0   則排序后為:   -3,-2,-16,-5,0,0,0,21,19,33,25,16,18,25請(qǐng)分析代碼邏輯,并推測(cè)劃線處的代碼,通過網(wǎng)頁(yè)提交注意:僅把缺少的代碼作為答案,千萬(wàn)不要填寫多余的代碼、符號(hào)或說明文字!!

【分析】該三部排序算法的基本思想:負(fù)數(shù)放左邊,正數(shù)放右邊,零放在中間。

源代碼:

#include <stdio.h>#include <string.h>#define maxn 105void sort3p(int* x, int len){	int p = 0;	int left = 0;	int right = len-1;		while(p<=right)	{		if(x[p]<0)		{			int t = x[left];			x[left] = x[p];			x[p] = t;			left++;			p++;		}		else if(x[p]>0)		{			int t = x[right];			x[right] = x[p];			x[p] = t;			right--;					}		else		{			p++;  //填空位置		}	}}int main()    {	int i,len,a[maxn]; 	while(scanf("%d",&len)!=EOF)	{		for(i=0;i<len;i++)			scanf("%d",&a[i]);		sort3p(a,len);		for(i=0;i<len;i++)			printf("%d ",a[i]);		printf("/n");	}	return 0;}程序截圖:

【答案】p++


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

圖片精選

主站蜘蛛池模板: 驻马店市| 祁门县| 西峡县| 雷山县| 望奎县| 聂拉木县| 万全县| 安岳县| 河津市| 大安市| 武定县| 手机| 望奎县| 瓦房店市| 政和县| 沐川县| 紫金县| 十堰市| 沁阳市| 如东县| 家居| 光山县| 略阳县| 奉节县| 汕头市| 宁安市| 南溪县| 富民县| 南阳市| 日喀则市| 西乌珠穆沁旗| 阿合奇县| 普安县| 威信县| 中牟县| 朔州市| 尼木县| 密山市| 罗甸县| 札达县| 昌都县|