只能在windows上运行

P1255 数楼梯

Chtholly_is_cute @ 2023-09-20 20:08:31

code:

#include<bits/stdc++.h>
using namespace std;
struct bigint{
    int len;
    int a[5000];
};
void set1(bigint &a,bigint b){
    a.len=b.len;
    memset(a.a,0,sizeof(a.a));
    for(int i=1;i<=a.len;i++){
        a.a[i]=b.a[i];
    }
}
void set2(bigint &a,int b){
    a.len=0;
    memset(a.a,0,sizeof(a.a));
    while(b){
        a.a[++a.len]=b%10;
        b/=10;
    }
}
void set3(bigint &a,string b){
    a.len=b.size();
    memset(a.a,0,sizeof(a.a));
    for(int i=1;i<=a.len;i++){
        a.a[i]=b[a.len-i]-'0';
    }
}
void print(bigint k){
    if(k.len==0){
        cout<<0;
        return;
    }
    for(int i=k.len;i>=1;i--){
        cout<<k.a[i];
    }
}
bigint add(bigint a,bigint b){
    bigint res;
    res.len=0;
    int jw=0;
    while(res.len<=a.len||res.len<=b.len){
        res.a[++res.len]=a.a[res.len]+b.a[res.len]+jw;
        jw=res.a[res.len]/10;
        res.a[res.len]%=10;
    }
    res.a[++res.len]=jw;
    while(res.len>=1&&res.a[res.len]==0)--res.len;
    return res;
}
int main(){
    int n;
    cin>>n;
    bigint a,b,c;
    if(n==1)cout<<0;
    else if(n==2)cout<<1;
    else if(n==3)cout<<2;
    else{
        set2(a,1);
        set2(b,2);
        for(int i=3;i<=n;i++){
            set1(c,add(a,b));
            set1(a,b);
            set1(b,c);
        }
        print(c);
    }
}

by PVZ__2 @ 2023-09-20 20:31:28

@andyzhu444

#include<bits/stdc++.h>
using namespace std;
char ans[5005][5005];
int main(){
    int n;
    cin>>n;
    ans[0][0]='1';
    ans[1][0]='1';
    for (int i = 2; i <= n; i++){
        int lens1 = strlen(ans[i - 1]);
        int lens2 = strlen(ans[i - 2]);
        char ans1[2005] = "";
        char ans2[2005] = "";
        for (int j = 0; j < lens1; j++)ans1[lens1 - j - 1] = ans[i - 1][j];
        for (int j = 0; j < lens2; j++)ans2[lens2 - j - 1] = ans[i - 2][j];
        int lens = lens1 > lens2 ? lens1 : lens2;
        char ans_tmp[3005] = "";
        for (int j = 0; j < lens; j++)
        {
            if (ans1[j])ans_tmp[j] += ans1[j] - '0';
            if (ans2[j])ans_tmp[j] += ans2[j] - '0';
            ans_tmp[j] += '0';
            if (ans_tmp[j] > '9')ans_tmp[j] -= 10,ans_tmp[j + 1] += 1;
        }
        if (ans_tmp[lens])
        {
            ans_tmp[lens++] += '0';
        }
        for (int j = 0; j < lens; j++)
        {
            ans[i][lens - j - 1] = ans_tmp[j];
        }
    }
    printf("%s\n", ans[n]);
    return 0;
}

|