虽然过了,但是不理解洛谷的IDE什么问题
查看原帖
虽然过了,但是不理解洛谷的IDE什么问题
984384
TraveltTibet楼主2023/4/14 22:24

先说问题把: 就是我以下代码的全局变量不同,也就是我设置数组长度得到的结果非常意外,先来一份没问题的代码如下:

//高精度计算n的阶乘,n<=50
#include<iostream>
using namespace std;
#define NUMBER 80
#define MAX 90
//数字要倒序存到数组里面
//高精乘
void GJC(int temp[NUMBER],int temp1[MAX],int c[MAX])
{
    int i,j;
    for(i=0;i<MAX;i++)
    {
        for(j=0;j<=i;j++)
            c[i] +=temp[j]*temp1[i-j];
        //进位
        if(c[i]>=10)
        {
            c[i+1] += c[i]/10;
            c[i] %=10;
        }
    }
}
//高精度加
void GJJ(int temp[MAX],int temp1[MAX],int c[MAX])
{
    int i,j;
    for(i=0;i<MAX;i++)
    {
        c[i] += temp[i]+temp1[i];
        if(c[i]>=10)
        {
            c[i+1] += c[i]/10;
            c[i] %=10;
        }
    }
}
int main()
{
    int a[MAX]={0},b[MAX]={0},n,i,j,sum[MAX]={0},c[MAX]={0},d[MAX]={0};
    cin>>n;
    for(i=1;i<=n;i++)
    {
        if(i==1)
        {
            a[0]=1;
            b[0]=1;
            d[0]=0;
            GJC(a,b,c);
            GJJ(c,d,sum);
            continue;
        }
        for(j=0;j<MAX;j++)
        {
            d[j]=sum[j];
            b[j]=c[j];
            c[j]=0;
            sum[j]=0;
        }
        a[0]=i%10;
        a[1]=i/10;
        GJC(a,b,c);
        GJJ(c,d,sum);
    }
    for(i=NUMBER;i>0;i--)
    {
        if(sum[i]!=0)
            break;
    }
    for(j=i;j>=0;j--)
    {
        cout<<sum[j];
    }
    return 0;
}

然后再来一份有问题的代码,大家重点关注全局变量和GJJ,GJC两个函数的两份代码的差异之处:

//高精度计算n的阶乘,n<=50
#include<iostream>
using namespace std;
#define MAX 90
//数字要倒序存到数组里面
//高精乘
void GJC(int temp[MAX],int temp1[MAX],int c[MAX])
{
    int i,j;
    for(i=0;i<MAX;i++)
    {
        for(j=0;j<=i;j++)
            c[i] +=temp[j]*temp1[i-j];
        //进位
        if(c[i]>=10)
        {
            c[i+1] += c[i]/10;
            c[i] %=10;
        }
    }
}
//高精度加
void GJJ(int temp[MAX],int temp1[MAX],int c[MAX])
{
    int i,j;
    for(i=0;i<MAX;i++)
    {
        c[i] += temp[i]+temp1[i];
        if(c[i]>=10)
        {
            c[i+1] += c[i]/10;
            c[i] %=10;
        }
    }
}
int main()
{
    int a[MAX]={0},b[MAX]={0},n,i,j,sum[MAX]={0},c[MAX]={0},d[MAX]={0};
    cin>>n;
    for(i=1;i<=n;i++)
    {
        if(i==1)
        {
            a[0]=1;
            b[0]=1;
            d[0]=0;
            GJC(a,b,c);
            GJJ(c,d,sum);
            continue;
        }
        for(j=0;j<MAX;j++)
        {
            d[j]=sum[j];
            b[j]=c[j];
            c[j]=0;
            sum[j]=0;
        }
        a[0]=i%10;
        a[1]=i/10;
        GJC(a,b,c);
        GJJ(c,d,sum);
    }
    for(i=MAX;i>0;i--)
    {
        if(sum[i]!=0)
            break;
    }
    for(j=i;j>=0;j--)
    {
        cout<<sum[j];
    }
    return 0;
}

第二份代码的错误形式就很离谱:

例如输入1时,输出为:

1875949600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001

正确的情况应该是1,很离谱对吧,鄙人也不知道哪出问题了,希望有大佬能解惑,在此谢过。。。

2023/4/14 22:24
加载中...