0 1 2 3 4 5 35 36 37 38 39 40
0 1 1 2 3 5 9227 1493 2415 3908 6324 1023
解析:數論題,智商不夠,就把網上大神的整理的思路簡述一下。
用到了斐波那契數列的通項公式。
先看對數的性質,loga(b^c)=c*loga(b),loga(b*c)=loga(b)+loga(c);
假設給出一個數10234432,那麼log10(10234432)=log10(1.0234432*10^7)=log10(1.0234432)+7;
log10(1.0234432)就是log10(10234432)的小數部分.
log10(1.0234432)=0.010063744
10^0.010063744=1.023443198
那麼要取幾位就很明顯了吧~
先取對數(對10取),然後得到結果的小數部分bit,pow(10.0,bit)以後如果答案還是<1000那麼就一直乘10。
注意偶先處理了0~20項是為了方便處理~
這題要利用到數列的公式:an=(1/√5) * [((1+√5)/2)^n-((1-√5)/2)^n](n=1,2,3.....)
AC代碼:
#include#include #include #include using namespace std; int f[21] = {0, 1, 1}; int main() { // freopen(in.txt, r, stdin); int n; for(int i = 2; i < 21; ++i) f[i] = f[i - 1] + f[i - 2]; while(scanf(%d, &n) != EOF) { if(n <= 20) { printf(%d , f[n]); continue; } else { double temp = -0.5 * log(5.0) / log(10.0) + ((double)n) * log((sqrt(5.0)+1.0)/2.0) / log(10.0); temp -= floor(temp); temp = pow(10.0, temp); while(temp < 1000) temp *= 10; printf(%d , (int)temp); } } return 0; }