求助!!!为什么n>=9时就不对?

P1255 数楼梯

pengqiushi @ 2022-10-07 12:05:41

代码如下:

#include<iostream>
using namespace std;
int a[105],la=1,b[105],lb=1,sum[105],lsum=1;
void cmp()
{
    //cout<<sum[1];
    la=lb;
    for(int i=1; i<=lb; i++)
        a[i]=b[i];
    lb=lsum;
    for(int i=1; i<=lsum; i++)
        b[i]=sum[i];
    int c=0;
    //lsum=1;
    for(int i=1; i<=1; i++){
        sum[i]=a[i]+b[i];
        if(sum[i]>=10){
            sum[i+1]++;
            sum[i]-=10;
            if(i==lsum){
                lsum++;
                //break;
            }
        }
    }
}
int main()
{
    int n;
    cin>>n;
    if(n==1||n==2){
        cout<<"1";
        return 0;
    }
    a[1]=1;
    b[1]=1;
    for(int i=1; i<=n; i++)
        cmp();
    /*if(n>=7)
        sum[lsum]++;*/
    for(int i=lsum; i>=1; i--)
        cout<<sum[i];
    return 0;
}

by _coastline_ @ 2022-10-07 20:22:56

for(int i=1; i<=lsum; i++){
        sum[i]=a[i]+b[i];
        if(sum[i]>=10){
            sum[i+1]++;
            sum[i]-=10;
            if(i==lsum){
                lsum++;
                //break;
            }
        }
    }

这一段错了,sum[i] 如果直接等于a[i]+b[i],上一位的进位就会被覆盖

而如果考虑sum[i] += a[i]+b[i],前提要保证sum数组在计算前清零,可以逐个设置,也可以使用memset函数


by _coastline_ @ 2022-10-07 20:24:33

还有你设置的那个变量c好像没什么用


by _coastline_ @ 2022-10-07 20:25:02

@pengqiushi


by pengqiushi @ 2022-10-07 21:24:27

@xujiabin194 谢谢,运行可以了,但提交后10分

#include<iostream>
using namespace std;
int a[105],la=1,b[105],lb=1,sum[105],lsum=1;
void cmp()
{
    //cout<<sum[1];
    la=lb;
    for(int i=1; i<=lb; i++)
        a[i]=b[i];
    lb=lsum;
    for(int i=1; i<=lsum; i++)
        b[i]=sum[i];
    int c=0;
    for(int i=1; i<=100; i++)
        sum[i]=0;
    for(int i=1; i<=lsum; i++){

        sum[i]+=a[i]+b[i];
        if(sum[i]>=10){
            sum[i+1]++;
            sum[i]-=10;
            if(i==lsum){
                lsum++;
                break;
            }
        }
    }

}
int main()
{
    int n;
    cin>>n;
    if(n==1||n==2){
        cout<<"1";
        return 0;
    }
    a[1]=1;
    b[1]=1;
    for(int i=1; i<=n; i++)
        cmp();
    for(int i=lsum; i>=1; i--)
        cout<<sum[i];
    return 0;
}

by _coastline_ @ 2022-10-07 21:40:48

@pengqiushi 你cmp改好了主函数又忘记改了(?


by _coastline_ @ 2022-10-07 21:41:56

@pengqiushi

if(n==1||n==2){
        cout<<"1";
        return 0;
    }
    a[1]=1;
    b[1]=1;

改成:

if(n==1||n==2){
        cout<<n;
        return 0;
    }
    a[1]=1;
    b[1]=2;

by pengqiushi @ 2022-10-07 21:48:04

@xujiabin194 还是不对啊

#include<iostream>
using namespace std;
int a[105],la=1,b[105],lb=1,sum[105],lsum=1;
void cmp()
{
    //cout<<sum[1];
    la=lb;
    for(int i=1; i<=lb; i++)
        a[i]=b[i];
    lb=lsum;
    for(int i=1; i<=lsum; i++)
        b[i]=sum[i];
    int c=0;
    for(int i=1; i<=100; i++)
        sum[i]=0;
    for(int i=1; i<=lsum; i++){

        sum[i]+=a[i]+b[i];
        if(sum[i]>=10){
            sum[i+1]++;
            sum[i]-=10;
            if(i==lsum){
                lsum++;
                break;
            }
        }
    }

}
int main()
{
    int n;
    cin>>n;
    if(n==1||n==2){
        cout<<n;
        return 0;
    }
    a[1]=1;
    b[1]=2;
    for(int i=3; i<=n; i++)
        cmp();
    for(int i=lsum; i>=1; i--)
        cout<<sum[i];
    return 0;
}

by _coastline_ @ 2022-10-07 21:49:48

az


by _coastline_ @ 2022-10-07 21:54:36

哦明白了

你cmp里面应该是先计算再交换数组的

我改成这样就OK了:

#include<iostream>
using namespace std;
int a[105],la=1,b[105],lb=1,sum[105],lsum=1;
void cmp()
{
    //cout<<sum[1];
    for(int i=1; i<=lsum; i++){

        sum[i]+=a[i]+b[i];
        if(sum[i]>=10){
            sum[i+1]++;
            sum[i]-=10;
            if(i==lsum){
                lsum++;
                break;
            }
        }
    }
    la=lb;
    for(int i=1; i<=lb; i++)
        a[i]=b[i];
    lb=lsum;
    for(int i=1; i<=lsum; i++)
        b[i]=sum[i];
    int c=0;
    for(int i=1; i<=100; i++)
        sum[i]=0;
}
int main()
{
    int n;
    cin>>n;
    if(n==1||n==2){
        cout<<n;
        return 0;
    }
    a[1]=1;
    b[1]=2;
    for(int i=3; i<=n; i++)
        cmp();
    for(int i=lb; i>=1; i--)
        cout<<b[i];
    return 0;
}

by _coastline_ @ 2022-10-07 21:57:47

还有一点:N最大5000,你数组开的有点小,我刚刚本地测IDE,1000就爆了

开到10000应该行,100可能不够会爆数组RE(不太确定,我写的时候开的12345


上一页 | 下一页