1. 程式人生 > 實用技巧 >第四屆藍橋杯B組

第四屆藍橋杯B組

1-高斯日記

題目描述

大數學家高斯有個好習慣:無論如何都要記日記。

他的日記有個與眾不同的地方,他從不註明年月日,而是用一個整數代替,比如:4210

後來人們知道,那個整數就是日期,它表示那一天是高斯出生後的第幾天。這或許也是個好習慣,它時時刻刻提醒著主人:日子又過去—天,還有多少時光可以用於浪費呢?

高斯出生於:1777年4月30日。

在高斯發現的一個重要定理的日記上標註著:5343,因此可算出那天是:1791年12月15日。高斯獲得博士學位的那天日記上標著:8113

請你算出高斯獲得博士學位的年月日。

提交答案的格式是:yyyy-mm-dd,例如:1980-03-21請嚴格按照格式,通過瀏覽器提交答案。
注意:只提交這個日期,不要寫其它附加內容,比如:說明性的文字。
答案:1799-07-16


通過第5343天為1791年12月15日可知,高斯出生的那一天,1777年4月30日算第1天;

std.cpp

#include<iostream>
using namespace std;
bool isLeapYear(int y){
	return (y%4==0&&y%100!=0)||(y%400==0);
}
int main(){
	int y=1777,m=4,d=30;
	for(int i=0;i<8112;++i){
		d++;
		if(m==12&&d==32){
			++y;
			m=1;
			d=1;
			continue; 
		}
		if((m==1||m==3||m==5||m==7||m==8||m==10)&&d==32){
			++m;
			d=1;
			continue;
		}
		if((m==4||m==6||m==9||m==11)&&d==31){
			++m;
			d=1;
			continue;
		}
		if(m==2&&isLeapYear(y)&&d==30){
			++m;
			d=1;
			continue;
		}
		if(m==2&&!isLeapYear(y)&&d==29){
			++m;
			d=1;
			continue;
		}
	}
	cout<<y<<" "<<m<<" "<<d<<endl;
	return 0;
}

2-馬虎的算式

題目描述

小明是個急性子,上小學的時候經常把老師寫在黑板上的題目抄錯了。

有一次,老師出的題目是:\(36 * 495 = ?\)

他卻給抄成了:\(396 * 45 = ?\)

但結果卻很戲劇性,他的答案竟然是對的!!

因為\(36*495 - 396*45 =17820\)

類似這樣的巧合情況可能還有很多,比如:\(27 * 594 = 297 * 54\)

假設\(abcde\)代表\(1\)~\(9\)不同的\(5\)個數字(注意是各不相同的數字,且不含\(0\))

能滿足形如:\(ab * cde = adb * ce\)這樣的算式一共有多少種呢?

請你利用計算機的優勢尋找所有的可能,並回答不同算式的種類數。

滿足乘法交換律的算式計為不同的種類,所以答案肯定是個偶數。

答案直接通過瀏覽器提交。
注意:只提交一個表示最終統計種類數的數字,不要提交解答過程或其它多餘的內容。
答案:\(142\)


std.cpp

#include<iostream>
using namespace std;
int main(){
	int ans=0;
	for(int a=1;a<10;++a)
		for(int b=1;b<10;++b)
			if(b!=a)	
				for(int c=1;c<10;++c)
					if(c!=a&&c!=b)
						for(int d=1;d<10;++d)
							if(d!=a&&d!=b&&d!=c)
								for(int e=1;e<10;++e)
									if(e!=a&&e!=b&&e!=c&&e!=d){
										//ab*cde=adb*ce
										if((a*10+b)*(c*100+d*10+e)==(a*100+d*10+b)*(c*10+e))
											++ans;
									}
	cout<<ans;
	return 0;
}

3-第39級臺階

題目描述

小明剛剛看完電影《第39級臺階》,離開電影院的時候,他數了數禮堂前的臺階數,恰好是39級!

站在臺階前,他突然又想著一個問題:

如果我每一步只能邁上1個或2個臺階。先邁左腳,然後左右交替,最後一步是邁右腳,也就是說一共要走偶數步。

那麼,上完39級臺階,有多少種不同的上法呢?

請你利用計算機的優勢,幫助小明尋找答案。

要求提交的是一個整數。

注意:不要提交解答過程,或其它的輔助說明文字。
答案:51167078


Solution

1.這道題適用 模式匹配法
2.去掉一個條件:偶數步,只問只能邁上1個臺階或2個臺階的條件下一共有多少種走法呢?
3.f(n=39){ return f(n-1)+f(n-2) },其實就是斐波那契數列;
4.此題加了限定條件,一定要走偶數步,則可跟蹤步數,只有偶數步符合要求即可。

std.cpp

#include<iostream>
using namespace std;
int ans;
/**
  * @param n 剩下的階梯數
  * @param step 已走的步數
  */ 
void f(int n,int step){
	if(n<0) return;
	if(n==0 && step%2==0) ++ans;
	f(n-1,step+1);
	f(n-2,step+1);
}
int main(){
	f(39,0);
	cout<<ans<<endl;
	return 0;
}

4-黃金連分數

題目描述

黃金分割數0.61803...是個無理數,這個常數十分重要,在許多工程問題中會出現。有時需要把這個數字求得很精確。

對於某些精密工程,常數的精度很重要。也許你聽說過哈勃太空望遠鏡,它首次升空後就發現了一處人工加工錯誤,

對那樣一個龐然大物,其實只是鏡面加工時有比頭髮絲還細許多倍的一處錯誤而已,卻使它成了“近視眼”!!

言歸正傳,我們如何求得黃金分割數的儘可能精確的值呢?有許多方法。

比較簡單的一種是用連分數:

\[黃金數=\frac{1}{1+\frac{1}{1+\frac{1}{1+\cdots}}} \]

這個連分數計算的“層數”越多,它的值越接近黃金分割數。

請你利用這一特性,求出黃金分割數的足夠精確值,要求四捨五入到小數點後100位

小數點後3位的值為:0.618

小數點後4位的值為:0.6180

小數點後5位的值為:0.61803

小數點後7位的值為:0.6180340

(注意尾部的0,不能忽略)

你的任務是:寫出精確到小數點後100位精度的黃金分割值。

注意:尾數的四捨五入!尾數是0也要保留!
顯然答案是一個小數,其小數點後有100位數字,請通過瀏覽器直接提交該數字。
注意:不要提交解答過程,或其它輔助說明類的內容。


Solution

1.列出前幾項,觀察規律:

\[\begin{aligned}\frac{1}{1+\frac{1}{1}} & =\frac{1}{2}\\ \frac{1}{1+\frac{1}{1+1}} & = \frac{2}{3}\\ \frac{1}{1+\frac{1}{1+\frac{1}{1+1}}} & = \frac{3}{5}\\ \frac{1}{1+\frac{1}{1+\frac{1}{1+\frac{1}{1+1}}}} & = \frac{5}{8}\\ \frac{1}{1+\frac{1}{1+\frac{1}{1+\frac{1}{1+\frac{1}{1+1}}}}} & = \frac{8}{11} \end{aligned} \]