原创:大数阶乘的讨论(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,应该说速度比较的慢,这也是没有办法的,因为用的是字符数组模拟.
//: 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,应该说速度比较的慢,这也是没有办法的,因为用的是字符数组模拟.
相关文章推荐
- 原创:大数阶乘的讨论(3)
- 原创:大数阶乘的讨论(1)
- 原创:大数阶乘的讨论(4) (源码未实现)
- [原创]阶乘(1000的阶乘,10000的阶乘...)以及大数相乘(几十万位乘几十万位)
- 大一下期末考试:大数存储 阶乘50!
- 大数,高精度计算---大数阶乘
- [笔试面试题]求大数的阶乘(如1024的阶乘)
- 计算大数阶乘
- NYOJ 28 大数阶乘
- HDU1042 N! 大数阶乘 Java
- Java 小例子:大数乘法和阶乘
- Matlab 计算大数的阶乘
- 大数阶乘
- 算法爱好者——大数阶乘 ? 待解决
- asp利用数组实现阶乘计算(大数相乘)
- 【学习笔记】大数阶乘
- 大数阶乘的实现
- HDU 1042 N! (大数阶乘加优化处理)
- 每日一算法:大数的阶乘
- 大数据之大数阶乘