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

上次我实现的阶乘虽然速度超快,但精确度实在欠缺,这次使用字符串数组储存每个位,可以实现阶乘完整输出,以下是我不久前写的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[N]=M[N];
}

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,应该说速度比较的慢,这也是没有办法的,因为用的是字符数组模拟.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值