求助,悬关

P1009 [NOIP1998 普及组] 阶乘之和

l_615 @ 2023-07-11 18:05:46

我找不到问题在哪qwq

#include<bits/stdc++.h>
using namespace std;
int a[100],b[100],c[100],sum[100];
void cheng(int n)
{
    int x;
    memset(c,0,sizeof(c));
    c[1]=1;
    for(int k=2;k<=n;k++)
    {
        for(int j=1;j<=100;j++)
        {
            a[j]=c[j];
        }
        x=k;
        /*

        int t;
        for(int i=100;i>=1;i--)
        {
            if(a[i]!=0)
            {
                t=i;
                break;
            }
        }
        for(int i=t;i>=1;i--)
        {
            printf("%d",a[i]);
        }printf("\n");

        */
        for(int j=1;x>0;j++)
        {
            b[j]=x%10;
            x/=10;
        }
        for(int i=1;i<=100;i++)
        {
            for(int j=1;j<=100;j++)
            {
                c[j]=a[j]*b[i]+c[j];
            }
        }
        for(int i=1;i<=100;i++)
        {
            if(c[i]>=10)
            {
                c[i+1]=c[i+1]+c[i]/10;
                c[i]=c[i]%10;
            }
        }
    }
}
void jia()
{
    for(int i=1;i<=100;i++)
    {
        sum[i]=sum[i]+c[i];
        if(sum[i]>9)
        {
            sum[i+1]=sum[i+1]+sum[i]/10;
            sum[i]=sum[i]%10;
        }
    }
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        cheng(i);
        jia();
    }
    int t;
    for(int i=100;i>=1;i--)
    {
        if(sum[i]!=0)
        {
            t=i;
            break;
        }
    }
    for(int i=t;i>=1;i--)
    {
        printf("%d",sum[i]);
    }
}

有没有大佬来帮我看一下哪出了问题


by wYYSZLwSSY @ 2023-07-11 18:39:13

@110001101liuyiran 首先你数组越界了


by wYYSZLwSSY @ 2023-07-11 18:44:03

这段代码

        for(int i=1;i<=100;i++)
        {
            for(int j=1;j<=100;j++)
            {
                c[j]=a[j]*b[i]+c[j];
            }
        }

是有问题的。


by wYYSZLwSSY @ 2023-07-11 18:45:00

事实上,这个题目的 n 不大,你完全可以用低精度乘高精度的方法


by wYYSZLwSSY @ 2023-07-11 18:45:47

大概长这样

#include<bits/stdc++.h>
using namespace std;
int a[1001],b[1001],c[1001],sum[1001];
void cheng(int n)
{
    int x;
    memset(c,0,sizeof(c));
    c[1]=1;
    for(int k=2;k<=n;k++)
    {
        int qw=0;
        for(int i=1;i<=1000;i++)
        {
            c[i]*=k;
            c[i]+=qw;
            qw=c[i]/10;
            c[i]%=10;
        }
    }
}
void jia()
{
    for(int i=1;i<=1000;i++)
    {
        sum[i]=sum[i]+c[i];
        if(sum[i]>9)
        {
            sum[i+1]=sum[i+1]+sum[i]/10;
            sum[i]=sum[i]%10;
        }
    }
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        cheng(i);
        jia();
    }
    int t;
    for(int i=100;i>=1;i--)
    {
        if(sum[i]!=0)
        {
            t=i;
            break;
        }
    }
    for(int i=t;i>=1;i--)
    {
        printf("%d",sum[i]);
    }
}

by l_615 @ 2023-07-12 10:56:52

谢谢谢谢


|