1 条题解

  • 0
    @ 2025-4-7 21:41:51

    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
    2030
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者