高精加40pts求助

P1255 数楼梯

HbugU @ 2022-05-20 13:08:01

#include<bits/stdc++.h>
using namespace std;
int n;
string f[5005];
string add(string as,string bs){
    string ans;
    int a[101]={0},b[101]={0},c[101]={0};
    int lena=as.length(),lenb=bs.length();
    for(int i=lena-1,j=1;i>=0;i--,j++){
        a[j]=as[i]-'0';
    }
    for(int i=lenb-1,j=1;i>=0;i--,j++){
        b[j]=bs[i]-'0';
    }
    int len=max(lena,lenb);
    for(int i=1;i<=len;i++){
        c[i]+=a[i]+b[i];
        c[i+1]+=c[i]/10;
        c[i]%=10;
    }
    if(c[len+1]) ++len;
    for(int i=len;i>=1;i--){
        ans+=c[i]+'0';
    }
    return ans;
}
int main(){
    cin>>n;
    f[1]="1",f[2]="2";
    for(int i=3;i<=n;i++){
        f[i]=f[i-1]+f[i-2];
    }
    cout<<f[n];
    return 0;
}

by Hisaishi_Kanade @ 2022-05-20 13:11:57

@HbugU

f=[0,1,2]
n=int(input())
if n<3:
    print(f[n])
else:
    for i in range(3,n+20):
        f.append(f[i-1]+f[i-2])
    print(f[n])

by Fcersoka @ 2022-05-21 09:10:18

自己看看吧......

#include<bits/stdc++.h>
using namespace std;
int n,f1[1000001],f2[1000001],f0[1000001],len1=1,len2=1,len0;
void jf(){//相加
    for(int i=1;i<=len2;i++)
    f2[i]=0;
    for(int i=1;i<=max(len1,len0);i++){
        f2[i]+=f1[i]+f0[i];
        if(f2[i]>=10)
        { 
            f2[i+1]+=f2[i]/10;
            f2[i]%=10;
        }
    }
    len2=max(len1,len0);
    if(f2[len2+1])
    len2++;
}
void f01(){
    for(int i=1;i<=len0;i++)
    f0[i]=0;
    for(int i=1;i<=len1;i++)
    f0[i]=f1[i];
    len0=len1;
}
void f12(){
    for(int i=1;i<=len1;i++)
    f1[i]=0;
    for(int i=1;i<=len2;i++)
    f1[i]=f2[i];
    len1=len2;
}
int main(){
    cin>>n;
    f0[1]=1;
    f1[1]=2;
    if(n==1){
        cout<<1;
        return 0;
    }
    else if(n==0){
        cout<<0;
        return 0;
    }
    for(int i=3;i<=n;i++){
        jf();
        f01();
        f12();
    }
    for(int i=len2;i>0;i--)
    cout<<f2[i];
    return 0;
}

|