寫的一個C++實現(xiàn)10000的階乘的代碼
#include
#define N 10000//設(shè)階乘數(shù)為10000
#define SIZE 40000//預(yù)留40000位保存結(jié)果
using namespace std;
void mul(int *n1,int n2)//兩數(shù)相乘
{
for(int i=0;i!=SIZE;++i)
n1[i]*=n2;
for(int i=0;i!=SIZE;++i){
n1[i+1]+=(n1[i]/10);
n1[i]%=10;
}
}
int main()
{
int *num=new int[SIZE];
memset(num,0,SIZE);
num[0]=1;
//N的階乘
for(int i=1;i!=N+1;++i){
mul(num,i);
}
//輸出時排除開頭的0
for(int i=SIZE-1;i!=-1;--i){
if(0!=num[i]){
for(int j=i;j!=-1;--j){
cout < }
break;
}
}
delete[] num;
return 0;
}
這個是第一版,很多地方不合理,尤其是需要預(yù)留空間,這就要我先預(yù)算一下會有多少位了。運(yùn)算時間20秒左右,效率也不行,應(yīng)該在10秒左右比較合理,機(jī)器為P3 733,內(nèi)存256MB。
#include
#define N 10000//設(shè)階乘數(shù)為10000
#define SIZE 40000//預(yù)留40000位保存結(jié)果
using namespace std;
void mul(int *n1,int n2)//兩數(shù)相乘
{
for(int i=0;i!=SIZE;++i)
n1[i]*=n2;
for(int i=0;i!=SIZE;++i){
n1[i+1]+=(n1[i]/10);
n1[i]%=10;
}
}
int main()
{
int *num=new int[SIZE];
memset(num,0,SIZE);
num[0]=1;
//N的階乘
for(int i=1;i!=N+1;++i){
mul(num,i);
}
//輸出時排除開頭的0
for(int i=SIZE-1;i!=-1;--i){
if(0!=num[i]){
for(int j=i;j!=-1;--j){
cout <
break;
}
}
delete[] num;
return 0;
}
這個是第一版,很多地方不合理,尤其是需要預(yù)留空間,這就要我先預(yù)算一下會有多少位了。運(yùn)算時間20秒左右,效率也不行,應(yīng)該在10秒左右比較合理,機(jī)器為P3 733,內(nèi)存256MB。