995

P1009 [NOIP1998 普及组] 阶乘之和

孟令然2013 @ 2024-08-09 15:03:15

#include<iostream>
#include<string.h>
using namespace std;
long long n,a[100005],ans[100005],tmp,tmp2;
int main()
{
    cin>>n;
    for(int i=n;i>=1;i--)
    {
        memset(a,0,sizeof(a));
        a[1]=1;
        tmp=1;
        for(int j=1;j<=i;j++)
        {
            tmp2=0;
            for(int k=tmp;k>=1;k--)
            {
                a[k]*=j;
                if(a[k]>=10)
                {
                    a[k+1]+=a[k]/10;
                    a[k]%=10;
                    tmp2++;
                }
            }
            tmp+=tmp2;
        }
        for(int j=1;j<=tmp;j++)
        {
            ans[j]+=a[j];
            if(ans[j]>=10)
            {
                ans[j+1]+=ans[j]/10;
                ans[j]%=10;
            }
        }
    }
    int flag=0;
    for(int i=n;i>=1;i--)
    {
        if(ans[i]!=0&&!flag)
        {
            flag=1;
        }
        if(flag)
        {
            cout<<ans[i];
        }
    }
    return 0;
}

75分...


by Xingyi_2014 @ 2024-08-14 11:43:50

我也是用的高精度,代码给你看一下,觉得还行就给个关注呗!

#include<iostream> 
using namespace std;
int main(){
    int s1[300]={1},s2[300]={0},len=0;
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=0;j<=len;j++){
            s1[j]*=i;
        }
        for(int j=0;j<=len;j++){
            if(s1[j]>=10){
                if(j==len){
                    len++;
                }
                s1[j+1]+=s1[j]/10;
                s1[j]%=10;
            }
        }
        for(int j=0;j<=len;j++){
            s2[j]+=s1[j];
            if(s2[j]>=10){
                s2[j+1]+=s2[j]/10;
                s2[j]%=10;
            }
        }
    }
    for(int i=len;i>=0;i--){
        cout<<s2[i];
    }
    return 0;
}

100分


by Xingyi_2014 @ 2024-08-14 11:50:55

@孟令然2013

可能存在的问题:

输出部分:在输出结果时,有时候会出现遗漏。例如,如果所有位数都是零,应该确保输出 0。

初始化问题:在每次阶乘计算开始时,可能需要重置 ans 数组,以避免上次计算结果影响当前计算


|