您的位置:首页 > 其它

原创:大数阶乘的讨论(2)

2007-07-23 20:32 211 查看
上次我实现的阶乘虽然速度超快,但精确度实在欠缺,这次使用字符串数组储存每个位,可以实现阶乘完整输出,以下是我不久前写的c++代码,其中还有一个计算大整数乘幂的函数

//: High Precision Calculator By Lewis Cheng Completed at 12:55 7/11/2007
// P.S. This algorithm is based on char array .

#include <iostream>
#include <time.h> //For timer
using namespace std;

#define MAX_LENGTH 2568 // Max length of results
#define VAL(x) ((int)x-48) // Convert a number character to integer val
#define CCHAR(x) ((char)((int)x+48)) // Convert a integer val to a number character

char ARRAY[MAX_LENGTH]; //Array for bit storage
int LENGTH; //Record current length
char M[MAX_LENGTH]; //RESULT OF MULTIPLY
char T[MAX_LENGTH]; //TEMP ARRAY
int L_T,L_M; //Length of T,M respectively
int i; //Loop variable

void INIT() //Initialize Array
{
LENGTH=1;
ARRAY[0]='1';
L_T=L_M=0;
for(i=MAX_LENGTH-1;i>=1;i--) ARRAY[i]='0';
}
void PRINT() //Print screen
{
for(i=LENGTH-1;i>=0;i--) cout<<ARRAY[i];
cout<<endl<<"Total "<<LENGTH<<" bits"<<endl;
}

void MULTIPLY(int n) //Normal multiply n unlimited
{
int X,Y,R=0,N=0;
for(i=0;i<=MAX_LENGTH-1;i++) M[i]='0';
while(n!=0)
{
for(i=0;i<=MAX_LENGTH-1;i++) T[i]=ARRAY[i];
L_T=LENGTH;
X=n%10;
n/=10;
//Mutiply X to T[]
if(X==0)
{
for(i=0;i<=L_T-1;i++) T[i]='0';
N++;
continue;
}

for(i=0,R=0;i<L_T;i++)
{
Y=X*VAL(T[i])+R;
R=Y/10;
Y%=10;
T[i]=CCHAR(Y);
}
if(R!=0)
{
T[L_T]=CCHAR(R);
L_T++;
}
/////////////////

//Tx10^N
if(N!=0)
{
for(i=L_T-1;i>=0;i--)
{
T[i+N]=T[i];
T[i]='0';
}
L_T+=N;
}
///////////

//Add T to M
for(i=0,R=0;i<=(L_T>L_M?L_T:L_M)-1;i++)
{
Y=VAL(T[i])+VAL(M[i])+R;
R=Y/10;
Y%=10;
M[i]=CCHAR(Y);
}
L_M=(L_T>L_M?L_T:L_M);
if(R!=0)
{
M[L_M]=CCHAR(R);
L_M++;
}
////////////

//Final
N++;
///////////
}
LENGTH=L_M;
for(N=0;N<=LENGTH-1;N++) ARRAY
=M
;
}

void FACT(int n)
{
INIT();
long t=clock();
while(n>1)
{
MULTIPLY(n);
n--;
}
t=clock()-t;
PRINT();
cout<<"it costs "<<t<<"ms"<<endl;
}

void POWER(int x,int y)
{
INIT();
long t=clock();
while(y!=0)
{
MULTIPLY(x);
y--;
}
t=clock()-t;
PRINT();
cout<<"it costs "<<t<<"ms"<<endl;
}

int main()
{
cout<<" 3^1000="<<endl;
POWER(3,1000);
system("PAUSE");
cout<<" 1000!="<<endl;
FACT(1000);
system("PAUSE");
return 0;
}
计算1000!需要125ms,应该说速度比较的慢,这也是没有办法的,因为用的是字符数组模拟.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: