hoj1568

Fibonacci数列的通项公式中由于(sqrt(5)-1)^n太小了,所以可以忽略,但是n必须大于16。这道题就是应用通项公式对10取对数的方法来做的,去除对数的整数部分就相当于把结果除以许多个10。

View Code
   
     
#include < stdio.h >
#include
< math.h >
#define a (sqrt(5.0)+1.0)/2
int main()
{
int n,i,j,t,f[ 21 ] = { 0 , 1 };
double ans;
for (i = 2 ;i < 21 ;i ++ )
f[i]
= f[i - 1 ] + f[i - 2 ];
while (scanf( " %d " , & n) != EOF)
{
if (n < 21 )printf( " %d\n " ,f[n]);
else
{
ans
=- 0.5 * (log10( 5.0 )) + n * log10(a);
ans
-= ( int )ans;
ans
= pow( 10.0 ,ans);
while (ans < 1000 )ans *= 10 ;
printf(
" %d\n " ,( int )ans);
}
}
return 0 ;
}

你可能感兴趣的:(OJ)