萌新求助,不知道我的高精度加和乘错哪里了

P1009 [NOIP1998 普及组] 阶乘之和

Dihuan @ 2023-10-25 09:02:44

大一刚开学新生求助,如有什么错误和不妥,请各位大佬指正

#include <stdio.h>
#include <string.h>

//main函数的参数↓↓↓ 
int n;//阶乘的上限
char length[9999];//最终结果的长度 

//高精度加法函数的变量↓↓↓
 char arr1[9999],arr2[9999];//两个高精度加数
 int jiashu1[9999],jiashu2[9999],he[9999]={'0'},he2[9999]={'0'};//两个高精度加数、高精度和的每个数字 
 int k_jiafa=0;//加法进位的数 
 int length_jiashu; //两个高精度加数中较长的长度 
 int flag;//判断 和 的数组的首位是否为0 

//高精度乘法函数的变量↓↓↓ 
char arr[9999]={'1'};//高精度乘数 
int chengshu[9999]={0};//乘数的每个数字
int ji[9999]; //积的每一个数字 
int k_chengfa=0;//乘法进位的数 
int length_chengshu;//高精度乘数的长度 

void gaojingdu_jiafa(char canshu[9999]) 
{
    sprintf(arr1,"%d",he2);
    strcpy(arr2,canshu);
    if(strlen(arr1)>=strlen(arr2))
    {
        length_jiashu=strlen(arr1);
    }else
    {
        length_jiashu+strlen(arr2); 
    }

    for(int i=0;i<strlen(arr1);i++)
    {
        jiashu1[i]=arr1[strlen(arr1)-1-i]-'0';
    }
    for(int i=0;i<strlen(arr2);i++)
    {
        jiashu2[i]=arr2[strlen(arr2)-1-i]-'0';
    }

    for(int i=0;i<=length_jiashu;i++)
    {
        he[i]=jiashu1[i]+jiashu2[i]+k_jiafa;
        k_jiafa=he[i]/10;
        he[i]%=10; 
    }

    flag=0;
    for(int i=length_jiashu;i>=0;i--)
    {
        if(flag!=0)
        {
            flag=1;
        }
        if(flag=1)
        {
            he2[length_jiashu-i]=he[i];
        }
     } 
}

void gaojingdu_chengfa(int j)
{
    length_chengshu=strlen(arr);
    for(int i=0;i<length_chengshu;i++)
    {
        chengshu[i]=arr[length_chengshu-1-i];
     } 

     for(int i=0;i<length_chengshu;i++)
     {
        ji[i]=chengshu[i]*j+k_chengfa;
         k_chengfa=ji[i]/10 ;
         ji[i]%=10;
     }

     if(k_chengfa!=0)
     {
        ji[length_chengshu]=k_chengfa;
        length_chengshu++;
        while(ji[length_chengshu-1>=10])
        {
            ji[length_chengshu]=ji[length_chengshu-1]/10;
            ji[length_chengshu-1]%=10;
            length_chengshu++;
         }
     }

     while(ji[length_chengshu-1]==0&&length_chengshu>1)
     {
        length_chengshu--;
     }

     for(int i=length_chengshu-1;i>=0;i--)
     {
        arr[length_chengshu-1-i]=ji[i];
     }
}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<n;i++)
    {
        for(int j=1;j<=i;j++)
        {
            gaojingdu_chengfa(j); 
        }
        gaojingdu_jiafa(arr);
        memset(arr,0,sizeof(arr));
    }
    sprintf(length,"%d",he2); 
    printf("%s",length);

    return 0;
}

by ouiostream @ 2023-10-25 17:08:38

#include<bits/stdc++.h>
using namespace std;
const int N=1001;
int a[N],b[N];
int n,len,x;
void multiplication(int num){
    x=0;
    int i;
    for(i=1;i<=len;i++){
        a[i]=a[i]*num+x;
        x=a[i]/10;
         a[i]%=10; 
    }
    while(x){
        a[i]=x%10;
        x/=10;
        i++;
    }
    len=i-1; 
}
void add(){
    x=0;
    for(int i=1;i<=len;i++){
        b[i]+=a[i]+x;
        x=b[i]/10;
        b[i]%=10;
    }
}
int main(){
    cin>>n;
    a[1]=1;
    len=1;
    for(int i=1;i<=n;i++){
        multiplication(i);
        add();
    }
    for(int i=len;i>=1;i--)
        cout<<b[i];
    cout<<endl; 
    return 0;
} 

上方代码,仅供参考


|