1 条题解
-
0
C :
#include "stdio.h" #include "math.h" int i,n,k,T; double a,b,c,d; int f[21]; void print_1(int s) { int a[4],d; if(n==0) { printf("0\n"); return ; } d=0; while(s) a[d++]=s%10,s/=10; for(i=d-1;i>=0&&d-i<=k;i--) printf("%d",a[i]); printf("\n"); } void print_2() { c=log10(a)+n*log10(b); c-=(int)c; d=pow(10,c); while(d<1000) d*=10; print_1((int)d); } int main() { f[0]=0; f[1]=f[2]=1; for(i=3;i<=20;i++) f[i]=f[i-1]+f[i-2]; a=sqrt(5); b=(1+a)/2; a/=5; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&k); if(n<=20) print_1(f[n]); else print_2(); } return 0; }
C++ :
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <vector> #include <climits> #include <stack> #include <queue> #include <map> #include <algorithm> #include <string> #include <cstring> #define MID(x,y) ((x+y)>>1) const double f=(sqrt(5.0)+1.0)/2.0; using namespace std; typedef long long LL; int fab[21]; int main(){ //freopen("test.in", "r", stdin); //freopen("test.out", "w", stdout); int t; scanf("%d", &t); while(t --){ int n, k; fab[0] = 0; fab[1] = 1; for (int i = 2; i <= 20; i ++) fab[i] = fab[i-1] + fab[i-2]; cin >> n >> k; double log10_fabn; if (n <= 20){ if (fab[n] <= pow(10, k-1)){ cout << fab[n] << endl; continue; } else{ log10_fabn = log(fab[n]); } } else{ log10_fabn = -0.5*log(5.0)/log(10.0)+((double)n)*log(f)/log(10.0);//忽略最后一项无穷小 } log10_fabn = log10_fabn - (int)log10_fabn; double num = pow(10, log10_fabn); while(num < pow(10, k-1)) num *= 10; cout << (int)num <<endl; } return 0; }
- 1
信息
- ID
- 2121
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者