以上两个公式是此题的关键,另外一个地方就是求出了 log10( f (n) ) 从而求 f ( n ) 的方法。
取首位数代码:
#include<stdio.h> #include<math.h> int main() { double x,tmp; while(scanf("%lf",&x)!=EOF) { tmp=log(x)/log(10.0); tmp=tmp-floor(tmp); tmp=pow(10.0,tmp); printf("%d\n",(int)tmp+0.000001); //控制精度否则输入个位数会出现问题 } return 0; } 2.
#include <stdio.h> #include <math.h> int main() { int ans; double num,a; double x; scanf("%lf",&num); x=log10(num); a=pow(10.0,x-(__int64)x); ans=int(a); printf("%d\n",ans); return 0; }
这是百度百科找来的说明,要掌握对数的运算性质。
完了算出小数部分,乘1000就是前4位了。
代码如下:
[cpp] view plain copy print ? #include <cstdio> #include <cmath> int main() { int f[22]={0,1,1}; for (int i = 3 ; i <= 20 ; i++) f[i] = f[i-1] + f[i-2]; double n; double a1 = log10(1.0 / sqrt(5)); double a2 = log10((1 + sqrt(5)) / 2); while (~scanf ("%lf",&n)) { if (n <= 20) { printf ("%d\n",f[(int)n]); continue; } double ans = a1 + n * a2; ans -= floor(ans); ans = pow (10,ans); ans = (int)(ans * 1000); printf ("%.lf\n",ans); } return 0; }
