高精求调

P1009 [NOIP1998 普及组] 阶乘之和

31415926f @ 2024-10-12 12:13:26

#include<bits/stdc++.h>
using namespace std;
int n,a[3],t,b[1000],temp=1,jw,c[1000],d[1000],ans=1,e[1000];
int main(){
//  freopen(".in","r",stdin);
//  freopen(".out","w",stdout);
    cin>>n;
    for(int i=1;i<=n;i++){
        t=0,jw=0;
        memset(c,0,sizeof(c));
        c[1]=1; 
        for(int h=i;h!=0;h/=10){
            a[++t]=h%10;
        }
        for(int j=1;j<=temp;j++)b[i]=c[i];
        for(int j=1;j<=temp;j++){
            for(int k=1;k<=t;k++){
                c[temp*t-j*k+1]+=b[j]*a[i]+jw;
                jw=(b[j]*a[i]+jw)/10;
            }
        }
        temp+=t;
        if(jw!=0){
            c[temp+1]=jw;
            temp+=1;
        }
        while(c[temp]==0&&temp>=1)temp--;
        jw=0;
        for(int j=1;j<=ans;j++)e[i]=d[i];
        for(int j=1;j<=max(temp,ans);j++){
            d[j]=e[j]+c[j]+jw;
            jw=(e[j]+c[j]+jw)%10;
        }
        ans=max(temp,ans);
        if(jw!=1){
            d[ans+1]=jw;
            ans++;
        }
        while(d[ans]==0&&ans>=1)ans--;
    }
    for(int i=ans;i>0;i--)cout<<d[i]; 
    return 0;
}

自己已经调过一遍了,改了一些地方,但还是找不出关键点???


by luogu_00 @ 2024-10-12 17:41:42

高精度加法代码实现:

string sum(string num1, string num2) {
    string result = "";
    bool carry = 0;
    int maxn = max(num1.length(), num2.length());
    for (int i = 0; i < maxn; i++) {
    int digit1 = (i < num1.length()) ? num1[maxn - i] - '0' : 0;
    int digit2 = (i < num2.length()) ? num2[maxn - i] - '0' : 0;
    int sum = digit1 + digit2 + carry;
    carry = sum / 10;
    result.push_back((sum % 10) + '0');
    }
    if (carry) result.insert(result.begin(), '1');
    return result;
}

这里有一些 string 的函数:
length:求字符串长度(字符个数)
push_back:在字符串的尾部添加字符
insert:将字符插入到字符串的一个位置(第一个参数是 iterator 迭代器)
begin:返回第一个字符,类型为 iterator 迭代器,通常用于 inserterase 函数


|