求助!!!!为甚10过不了

P1255 数楼梯

Twistzz__ @ 2023-10-08 23:45:59

不懂呐 ! ! ! 求大佬帮助

#include<bits/stdc++.h>
using namespace std;
int dp[5003][5003],len=1,n;
void H(int a){
    for(int i=1;i<=len;i++)dp[a][i]=dp[a-1][i]+dp[a-2][i];
    for(int i=1;i<=len;i++){
        if(dp[a][i]/10!=0 && dp[a][i+1]==0)len++;
        dp[a][i+1]+=dp[a][i]/10;
        dp[a][i]%=10;
    }
}
int main(){
    scanf("%d",&n);
    dp[1][1]=1;
    dp[2][1]=2;
    for(int i=3;i<=n;i++)H(i);
    while(dp[n][len]==0)len--;
    for(int i=len;i>=1;i--)printf("%d",dp[n][i]);
    return 0;
}

by Jianbing_Juan @ 2023-10-08 23:59:19

要用高精度。@1132tbs


by MrcFrst @ 2023-10-09 07:26:37

@Jianbing_Juan 你说得对,但是 void H(int a) 函数貌似就是在实现高精度。


by Jianbing_Juan @ 2023-10-09 11:44:56

@MrcFrst_LRY 哦。。那我再看一眼

我大意了啊


by Jianbing_Juan @ 2023-10-09 12:18:34

知道了。你的代码使得 len 一直增加,超出了数组限制。应当在每次状态转移以后都去除前导零,使 len 减小。

改了一处,AC了

#include<bits/stdc++.h>
using namespace std;
int dp[5003][5003],len=1,n;
void H(int a){
    for(int i=1;i<=len;i++)dp[a][i]=dp[a-1][i]+dp[a-2][i];
    //cout<<a<<' '<<len<<endl;  //debug
    for(int i=1;i<=len;i++){

        if(dp[a][i]/10!=0 && dp[a][i+1]==0)len++;
        dp[a][i+1]+=dp[a][i]/10;
        dp[a][i]%=10;
    }
    //下面是新添加的代码
    while(dp[a][len]==0)len--;
}
int main(){
    scanf("%d",&n);
    dp[1][1]=1;
    dp[2][1]=2;
    for(int i=3;i<=n;i++)H(i);
    while(dp[n][len]==0)len--;
    for(int i=len;i>=1;i--)printf("%d",dp[n][i]);
    putchar('\n');
    return 0;
}

by Jianbing_Juan @ 2023-10-09 12:19:34

@Jianbing_Juan @1132tbs

可以了


by Twistzz__ @ 2023-10-09 18:12:02

懂了懂了,谢谢大佬!!! @Jianbing_Juan


|