2021-05-05

走过路过的大神,请救本菜鸟于水火,万谢!!

高精度计算出 S = 1! + 2! + 3! + \cdots + n!S=1!+2!+3!+⋯+n!时出现了问题

一、用数组的动态分配方式,这里出了问题

#include<iostream>
#include<cstring>
#define MAX 10000
using namespace std;
//求n!,结果存放进s,逆序 
int fac(int n,int *s)
{
    int i,j,k=1,cf;//s[1]=1,其它为0,k是当前计算阶乘的位数  
    for(i=0;i<MAX;i++)s[i]=0;
    s[1]=1;
    for(i=1;i<=n;i++)
    {
        j=1;cf=0;//j=0,表示从s[]中的第1位开始乘 i,进位标识为0 
        while(j<=k)//i与s[1..k]各位分别相乘 
        {
            s[j]=s[j]*i+cf;
            cf=s[j]/10;
            s[j]=s[j]%10;
            j++;    
        } 
        if(cf!=0)//最后的进位标识可能是几位数,如cf=1291 
        {//将cf按个位、十位...分别写入s[j],s[j+1].... 
            while(cf/10)
            {
                s[j++]=cf%10;
                cf=cf/10;
            }
            s[j]=cf;//不要忘了cf的个位 
        }
        else j--;//如果没有进位 
        k=j; //记录当前s中共写入了多少位结果 
    }
    return k;//返回位数 
 }
//输出数组中的数据 ,正序 
void show(int *a,int len)
{
    for(int j=len;j>=1;j--)
        cout<<a[j];
}
int main()
{
    int *a,*b,*c,n,lena,lenb=0,i,j,k,cf;//cf为进位标识 
    a=new int[MAX]; b=new int[MAX];c=new int[MAX];
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));
    
    cin>>n;
    for(i=1;i<=n;i++)
    {    
        lena=fac(i,a);//i的阶乘结果存放在数组a中,同时获得阶乘的位数 
        cout<<"\na:len="<<lena<<" data=";show(a,lena);
        cout<<" b:len="<<lenb<<" data=";show(b,lenb);
        //高精度相加
        k=1;cf=0;
        while(k<=lena||k<=lenb) 
        {
            c[k]=a[k]+b[k]+cf;
            cf=c[k]/10;
            c[k]=c[k]%10;
            k++;
        }
        if(cf==1)c[k]=cf;
        else k--;
        lenb=k;
        //for(k=1;k<=lenb;k++)b[k]=c[k];//将c复制给b 
        b=c;
        cout<<" a+b:";show(b,lenb);//输出高精度加的结果 
    }

    return 0;
}

用dev-c运行,分别输入n=4和5,   4的阶乘居然都不相同,真心求教!!!

第1次运行,输入n=4,结果如下图

第2次运行,再次输入n=4,如下图,结果居然变了(求教什么原因!!!!)

第3次运行,输入n=5,如下图,结果又变了,纠结。。。。。。

换成用VC++6.0调试,结果完全不同!!!

哪位大神走过路过,请不吝赐教,救本菜鸟于水火,万谢!!

二、如果改成数组的静态分配方式,以下代码调试没有问题

#include<iostream>
#include<cstring>
#define MAX 10000
using namespace std;
//求n!,结果存放进s,逆序 
int fac(int n,int s[MAX])
{
    int i,j,k=1,cf;//s[1]=1,其它为0,k是当前计算阶乘的位数  
    for(i=0;i<MAX;i++)s[i]=0;
    s[1]=1;
    for(i=1;i<=n;i++)
    {
        j=1;cf=0;//j=0,表示从s[]中的第1位开始乘 i,进位标识为0 
        while(j<=k)//i与s[1..k]各位分别相乘 
        {
            s[j]=s[j]*i+cf;
            cf=s[j]/10;
            s[j]=s[j]%10;
            j++;    
        } 
        if(cf!=0)//最后的进位标识可能是几位数,如cf=1291 
        {//将cf按个位、十位...分别写入s[j],s[j+1].... 
            while(cf/10)
            {
                s[j++]=cf%10;
                cf=cf/10;
            }
            s[j]=cf;//不要忘了cf的个位 
        }
        else j--;//如果没有进位 
        k=j; //记录当前s中共写入了多少位结果 
    }
    return k;//返回位数 
 }
//输出数组中的数据 ,正序 
void show(int a[MAX],int len)
{
    for(int j=len;j>=1;j--)
        cout<<a[j];
}
int main()
{
    int a[MAX],b[MAX],c[MAX],n,lena,lenb=0,i,j,k,cf;//cf为进位标识 
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));
    cin>>n;
    for(i=1;i<=n;i++)
    {    
        lena=fac(i,a);//i的阶乘结果存放在数组a中,同时获得阶乘的位数 
        cout<<"\na:len="<<lena<<" data=";show(a,lena);
        cout<<" b:len="<<lenb<<" data=";show(b,lenb);
        //高精度相加
        k=1;cf=0;
        while(k<=lena||k<=lenb) 
        {
            c[k]=a[k]+b[k]+cf;
            cf=c[k]/10;
            c[k]=c[k]%10;
            k++;
        }
        if(cf==1)c[k]=cf;
        else k--;
        lenb=k;
        for(k=1;k<=lenb;k++)b[k]=c[k];//将c复制给b 
        cout<<" a+b:";show(b,lenb);//输出高精度加的结果 
    }

    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值