|
|
代码如下(结果保存在字符数组里,仅仅打印出来):

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

#define N 1000 //结果位数上限(10进制)

char *ret;
//char ret[N]; //存放阶乘结果(也是下一次计算的被乘数)
int ret_size=1;

void fact(char *fac)
  {
char *buf,*p,*cf,ci=0,ct=0,cu=0;
int len,len1,len2,i,j=0;
len1=ret_size;
len2=strlen(fac); //乘数位数
len=len1+len2;
buf=new char[len]; //暂存计算结果
memset(buf,0,len);
cf=fac+len2-1; //指向乘数中当前进行计算的位
while(cf>=fac)
 { p=ret+len1-1;
i=ci++;
for(int m=0;m<len1;m++)
 {
ct=(*(p--)) * (*cf-0x30)+cu+buf[i];
buf[i++] = ct%10;
cu=ct/10; //进位
}
if(m==len1 && cu)
 {
buf[i++] += cu;
cu=0;
}
cf--; //进行乘数下个位的乘法
}

ret_size=i;
//复制结果到ret中
for(int k=0;k<i;k++)
ret[k]=buf[i-k-1];

delete []buf;
}

int main()
  {
char ch[20]; //要求的n!中n的10进制位数
int t=0,x=1; //t: 阶乘数
cout<<"输入要计算的阶乘n!中的数n:";
while(!t)
 {
cin>>t;
if(t<=0)
cout<<"输入错误,重新输入:";
cin.clear();
cin.ignore();
}
int n=t,z=0;
while(n>0)
 {
n /= 10;
z++;
}

ret=new char[t*z+20];

memset(ret,0,sizeof(ret));
ret[0]=1;
ret_size=1; //保存阶乘结果的位数

while(x<=t)
 {
cout<<x<<"! = ";
sprintf(ch,"%d",x++);
fact(ch);//计算 x! ,根据 x! = x* (x-1).
//打印x!
for(int i=0;i<ret_size;i++)
cout<<(char)(ret[i]+0x30);
cout<<endl<<endl;

}

delete []ret;

system("pause");
return 0;
}


|