发一个计算任意阶乘的程序,请多提意见
输入的数值超过10000时,运算时间较长,若达到10万,需20--30分钟/****************************************************************/
/*
* 程序目的:求任意位数的阶乘。
* Author :lhsong
* Date :2008-4-22
*/
#include <stdio.h>
#include <iostream>
using namespace std;
#define kk 1000
#define BS 5 //分配内存放大倍数
int main()
{
int *data=new int[kk+1]; /* data[0] 未使用*/
int index = 1; /* 表示数组中的位数 */
int n=1; /* 准备计算的数值 */
int a; //进位值
int ff=kk+1;
while(n!=0){
cout << " 输入需计算的阶乘(0退出): " ;
cin >> n;
cout<< endl;
if(n>10000)
cout<<" 输入的数值太大,运算时间较长,请耐心等待!"<<endl<<" 正在计算..."<<endl;
else
cout<<" 请稍后!正在计算..."<<endl;
/* 初始化数组 */
for(int i =0; i<ff; ++i)
data[i] = 0;
a=0; /* 初始,a=0 */
index = 1;
data[1] = 1; /* 初始,1!=1 */
for(int i=1; i<=n; ++i)
{
/* 计算阶乘 1x2x3x4x5x6x7x8x9x...(n-1)xn*/
a=0;
for(int j=1; j<=index; ++j){
data[j]=a+data[j]*i; //计算乘积的每一位与下一个乘数的乘积,并加上上一个的进位
a=data[j]/10; //a存储商
data[j]%=10; //该数组位存储乘积的个位数
if(j==index&&a!=0){ //如果已达到有效位数,如123456中,j=6,index=6,a=306,则需将a值计入下一个数组位,且index增1,并将新增位数的值拆分为0~9一次计入后面的数组,
data[j+1]+=a; /* 当前位进位 */
for(int m=j+1;a!=0;){
index++; //记录有效数组位数
if(index==ff-1){ //如果数组已满,则增加数组的位数(原默认位数为ff-1=kk=1000位,即最大为449的阶乘,450的阶乘有1001位),并重新计算
if(n<=1000)ff=2569+1; //1000的阶乘为2568位
else if(n<=5000)ff=16328+1;
else if(n<=10000)ff=35662+1;
else if(n<=15000)ff=56132+1;
else if(n<=20000)ff=77338+1;
else if(n<=30000)ff=121290+1;
else if(n<=50000)ff=213284+1;
else if(n<=100000)ff=456575+1;
else ff=n*BS+1; //需分配的内存数
delete []data;
a=0; /* 初始,a=0 */
index = 1; /* 初始,1!=1 */
data=new int[ff];
/* 初始化数组 */
for(i =0; i<ff; ++i)
data[i] = 0;
data[1] = 1;
i=1; //将循环记录初始化
goto hh; //重新计算
}
a=data[m]/10;
data[m]%=10;//该数组位存储个位数
data[m+1]+=a;/* 当前位进位 */
m++;
// cout<<"j="<<j<<",index="<<index<<",a="<<a<<" ";
if(a==0)goto hh;//计算下一轮乘数
}//循环,直到数组中每一位存储0~9的数字,
}
}
hh:;//计算下一轮乘数
}
if(n!=0){
cout << n << "! = ";
for(int j=index; j>0; --j)
cout << data[j];
cout << endl;
cout<<"\a 共有:"<<index<<"位。"<<"最大位数:"<<ff-1<<"位。"<<endl;
}
end:;
}
delete []data;
return 0;
}