90分蒟蒻求助

P1255 数楼梯

yehaoming @ 2024-07-09 22:35:30

高精

#include<bits/stdc++.h>
using namespace std;

int last1[5010];
int last2[5010];
int now[5010];

void printBIG(int a[])
{
    for(int i=a[0];i>=1;i--)cout<<a[i];
}

void s2BIG(string s,int a[])
{
    a[0]=s.size();
    for(int i=1;i<=a[0];i++)
    {
        a[i]=s[a[0]-i]-'0';
    }
}

void addBIG(int a[],int b[],int c[])
{
    int u=0;
    c[0]=max(a[0],b[0]);
    for(int i=1;i<=c[0];i++)
    {
        int t=a[i]+b[i]+u;
        c[i]=t%10;
        u=t/10;
    }
    if(u>0)
    {
        c[0]++;
        c[c[0]]=u;
    }
}

int main()
{
    int n;
    cin>>n;
    if(n==1||n==2)
    {
        cout<<1<<endl;
        return 0;
    }
    string s1="1",s2="1",s3="0";
    s2BIG(s1,last1);
    s2BIG(s2,last2);
    s2BIG(s3,now);
    for(int i=2;i<=n;i++)
    {
        addBIG(last1,last2,now);
        memcpy(last2,last1,sizeof(last2));
        memcpy(last1,now,sizeof(last1));
    }
    printBIG(now);
    return 0;
}

改必关


by smart_ @ 2024-07-09 22:39:46

是不是有点复杂化了? 这题高精+递推就可以做了

@yehaoming


by Handezheng @ 2024-07-10 07:59:39

我改了一下,AC了


by Handezheng @ 2024-07-10 08:01:20

@yehaoming
请你考虑,当n=2时,有几种方法

  1. 从0走两步
  2. 从0 走到1,再走到2 所以你的特判应该改一下

|