写了高精度50分

P1009 [NOIP1998 普及组] 阶乘之和

Druid @ 2024-06-06 20:57:21

高精度五十分求调

#include<bits/stdc++.h>
using namespace std;
int n;
short a[2048],b[2048],al=1,bl=1;
void solve()
{
    a[1]=1;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=al;j++)
        {
            a[j]=a[j]*i;

        }
        for(int j=al;j>=1;j--)
        {   
            if(a[j]>10)
            {
                a[j+1]+=a[j]/10;
                if(j+1>al)
                    al++;
                a[j]=a[j]%10;
            }
        }
        for(int j=1;j<=al;j++)
        {
            b[j]=b[j]+a[j];
            if(b[j]>10)
            {
                b[j+1]+=b[j]/10;
                if(j+1>bl)
                    bl++;
            }
            b[j]=b[j]%10;
        }
    }
    for(int i=bl;i>=1;i--)
    {
        cout<<b[i];
    }
}
int main()
{
    cin>>n;
    if(n==0 or n==1)
    {
        cout<<1;
        return 0;
    }
    solve();
    return 0;
}

by sdsswyd @ 2024-06-06 21:09:02

@dly0331 你看看我的(本题为我们学校OJ练习):

#include<bits/stdc++.h>
using namespace std;
unsigned long long a[40005],lc[40005]={0,1};//int long long对于最大数过不去 
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        int chang=40000,t=0;
        while(lc[chang]==0&&chang>0)chang--;
        for(int j=1;j<=chang+1;j++){
            lc[j]*=i;
        }
        for(int j=1;j<=chang+1;j++){
            lc[j+1]+=lc[j]/10;
            lc[j]%=10;
        }
//      for(int i=100;i>=1;i--)cout<<lc[i];
//      cout<<endl;
        chang=40000;
        while(lc[chang]==0&&chang>0)chang--;
        for(int j=1;j<=chang+1;j++){
            a[j]+=lc[j];
            a[j+1]+=a[j]/10;
            a[j]%=10;
        }
    }//避免多于计算 
    int chang=40000;
    while(a[chang]==0&&chang>0)chang--;
    for(int i=chang;i>=1;i--)cout<<a[i];
    return 0;
}

by Druid @ 2024-06-06 21:20:19

@sdsswyd 谢谢可能我没开long long


by sdsswyd @ 2024-06-06 21:21:35

@dly0331 关注你了


|