走过路过的大神,请救本菜鸟于水火,万谢!!
高精度计算出 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;
}