高精度25分求助!!!

P1009 [NOIP1998 普及组] 阶乘之和

_buzhidao_ @ 2023-04-10 21:45:59

#include<bits/stdc++.h>
using namespace std;
short a1[1000],b1[1000],c[1000],lea,leb,lec=1;
string f,g;
void chushihua(string a,string b){
    lea=a.size();
    leb=b.size();
    for(int i=0;i<1000;i++){
        a1[i]=0;
    }
    for(int i=0;i<1000;i++){
        b1[i]=0;
    }
    for(int i=1;i<=lea;i++){
        a1[i]=a[lea-i]-48;
    }
    for(int i=1;i<=leb;i++){
        b1[i]=b[leb-i]-48;
    }
    for(int i=0;i<1000;i++){
        c[i]=0;
    }
}
string jia(string a,string b){
    chushihua(a,b);
    lec=1;
    int x=0;
    while(lec<=lea||lec<=leb){
        c[lec]=a1[lec]+b1[lec]+x;
        x=c[lec]/10;
        c[lec]%=10;
        lec++;
    }
    c[lec]=x;
    while(c[lec]==0&&lec>1){
        lec--;
    }
    string ss="",s1=" ";
    for(int i=lec;i>0;i--){
        s1[0]=c[i]+48;
        ss.append(s1);
    }
    return ss;
}
string cheng(string a,string b){
    chushihua(a,b);
    int x;
    for(int i=1;i<=lea;i++){
        x=0;
        for(int j=1;j<=leb;j++){
            c[i+j-1]=a1[i]*b1[j]+x+c[i+j-1];
            x=c[i+j-1]/10;
            c[i+j-1]%=10;
        }
        c[i+leb]=x;
    }
    lec=lea+leb;
    while(c[lec]==0&&lec>1){
        lec--;
    }
    string z="",y=" ";
    for(int i=lec;i>=1;i--){
        y[0]=c[i]+48;
        z.append(y);
    }
    return z;
}
string int_str(int a){
    int b=a;string s="",ss=" ";
    while(b!=0){
        ss[0]=b%10+48;
        s.append(ss);
        b/=10; 
    }
    return s;
}

short n;string sk,t="0";
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        sk="1";
        for(int j=1;j<=i;j++){
            sk=cheng(int_str(j),sk);
            //cout<<sk<<' ';//
        }
        //cout<<sk<<endl;//
        t=jia(t,sk);
        //cout<<t<<endl;//
    }
    cout<<t;
    return 0;
}

第一次尝试高精度,一定是代码的问题


by xxc123 @ 2023-04-10 22:09:49

@buzhidao 高精度简单点吧!!! 求关注

 #include<iostream>
using namespace std;
int a[1001],b[1001];
void add()
{
    int t=0;
    for(int i=1000;i>=1;i--)
    {
        b[i]=b[i]+a[i]+t;
        t=b[i]/10;
        b[i]%=10;
    }
}
void multiplication(int x)
{
    int t=0;
    for(int i=1000;i>=1;i--)
    {
        a[i]=a[i]*x+t;
        t=a[i]/10;
        a[i]%=10;
    }
}
void print()
{
    int flag=0;
    for(int i=1;i<=1000;i++)
    {
        if(b[i]!=0) flag=1;
        if(flag) cout<<b[i];
    }
}
int main()
{
    a[1000]=b[1000]=1;
    int n;
    cin>>n;
    for(int i=2;i<=n;i++)
    {
        multiplication(i);
        add();
    }
    print();
    return 0;
}

从末尾算,a是阶乘积,s是和


by _buzhidao_ @ 2023-04-11 20:48:23

@xxc123 你也是5年级!已关注
好了我试试
《忌:继续完成WA的题 然而变成了TLE》

using namespace qwq;

by _buzhidao_ @ 2023-04-11 21:19:39

@xxc123 你的加法好像没有进位


by xxc123 @ 2023-04-11 21:39:25

@buzhidao 我是通过的呀。 都跟竖式一样,从后往前 t是进位的


by xxc123 @ 2023-04-11 21:40:37

@buzhidao 你是自己学的吗 还是实验舱 我是我爸教我的


by _buzhidao_ @ 2023-04-12 21:13:21

@xxc123 你的有进位
我是看书写的,稍微改动,所以3WA


|