第四屆藍橋杯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} \]