高精度把我这个蒟蒻干傻了(求调

P1009 [NOIP1998 普及组] 阶乘之和

little_q_exist @ 2024-10-20 10:50:27

代码如下,WA on #3 #4

#include<iostream>
#include<cstring>
using namespace std;
int a[52*2],b[52*2],c[52*4],d[52*4],f[52*4+10];

 // a数组输入i++,c数组为相乘结果,放入b数组继续相乘。f数组储存相加结果,(d数组没什么用但是并不妨碍我写出一堆bug

int alen = 1,blen = 1,clen = 1,dlen = 1,flen = 1;

void add(){
    for (int j = 0;j<blen;j++)
    {
        f[j] += b[j]; // 加法
    }
    flen = blen;
    for (int i = 0;i<flen;i++)
    {
        if (f[i]>9) //进位
        {
            f[i+1] += (f[i]/10);
            f[i] %= 10;
        }
    }
    while (f[flen+1])
    {
        flen ++; // 调整位数,防止漏进位
    }
}

void flatten(int n){ // 把a“铺开”并进位
    a[0] = n;
    for (int i = 0;i<alen;i++)
    {
        if (a[i]>9)
        {
            a[i+1] += (a[i]/10);
            a[i] %= 10;
            if (i + 1 == alen)
            {
                alen ++;
            }   
        }
    }
}

void mult(int k){ // 乘法
    flatten(k);
    for (int i = 0;i<alen;i++)
    {
        for (int j = 0;j<blen;j++)
        {
            c[i+j] += a[i] * b[j];
        }
    }
    clen = alen+blen;
    for (int i = 0;i<clen;i++)
    {
        if (c[i]>9)
        {
            c[i+1] += (c[i]/10);
            c[i] %= 10;
        }
    }
    for (int i = 0;i<clen;i++)
    {
        b[i] = c[i];
    }
    blen = clen;
    memset(c,0,sizeof(c));
}

int main(){
    b[0] = 1;
    int n;
    cin>>n;
    for (int i = 1;i<=n;i++)
    {
        mult(i);
        add();
    }
    while (!f[flen] && flen>=1)
    {
        flen --;
    }
    for (int i = flen;i>=0;i--)
    {
        cout<<f[i];
    }
    cout<<endl;
    return 0;
}

by Netherite_Pickaxe @ 2024-10-20 10:56:30

@little_q_exist 1<=n<=50,直接打表就行


by lichongkai @ 2024-10-20 11:00:27

@Su_chang2014你过分了吧,好打吗?


by abssortpow1145145 @ 2024-10-21 20:39:48

不要看,输入1000只会输出“402790050531223457680670558292183044930441094551528966419334642920075902370082550849878938011122874840322664395727767319128483846892726398968790560901035018977865543415443376965144616549510538851077440410165819782073475583082079396504111380884916810768467471317168913183948275897490803646698793846190852594417739671786914563472162093180956284720843607311204509397095907530114810381703803860648328656344389023077975647748628886817466804724858587747840936784462436173977429991182753207302348016538494642001301432395279726745538178727708503090870745742249581124437084158031806471602854863650302741825130214652788342621283870175833906572656890104432413095171095723550851047360182700817666447833450097928957386876271765554137407111747666512309980678539886786878262902584539118231519316835523885400137767203426696953126303292828224235349134630280084480064650497764755473824102259453127730077777531063115138764952527597098445380046443997540925880086936317933421768424925084707414812932329166745886234137226923024813461900363225999464524935227947647167947434411637139203517404371214232998239493954562323327076903915931443305369962856388265027346155623332543302943446674383336900484885947609695640139797208838438493998636482572950930777919644406154624084228042985270573774543689565298092301062689807689071120317578510142181892798247199071452022029172707400688758980305702923813291544851703914211657597582497807598793035565731652297925769886549168450867091163868402442018371341022143349040941897422377931540131712376088451926646802255265721820332564453961091792448710886674897251899281432897966817352381951694370184383299109654078410356489144960977274480320655205474842571310858767154579079644215514199003832599232631020684528203955813111140473074686810426051322892063650122841004997271652977702547274337834459757112850838135183696311712170990224739928697694772853140476802033735594574707189941820656793611572800671948131128109558012358679446259496244143021997936801273888393102412918463505832701613704464047394891693567824946365095976820092895872874833067345472399549213736568277881574159120670765215962463587184455433922702506813953637742383768964226648365610070168839324749896910992390804658988479107678562550844858514512762455637677863067821690083222834405613388709119188719479181528190836888908152845729021513491658586509889455613570273121541638995145894561079999213500076101248781500642979091198044736325729107144579768273776743716439557581557253878204647391176582851167312182026188795156620056856503340092247479478684738621107994804323593105039052556442336528920420940313”


#include <bits/stdc++.h>
using namespace std;
long long k[1000005];
int main()
{
    long long n,l;
    cin >> n;
    for(int p=1;p<=n;p++)
    {
        int x=p,xk[10005]={1},len=1;
        for(int i=1;i<=x;i++)
        {
            int j,t=0;
            for(j=0;j<len || t!=0;j++)
            {
                int s=xk[j]*i+t;
                xk[j]=s%10;
                t=s/10;
            }
            len=j;
        }
        int h,tk=0;
        for(h=0;h<len || tk!=0;h++)
        {
            int v=xk[h]+k[h]+tk;
            k[h]=v%10;
            tk=v/10;
        }
        l=len;
    }
    for(int i=l-1;i>=0;i--)
    {
        cout << k[i];
    }
    return 0;
}

|