C++的高精度

C++写的没有负数、没有除法的高精度

 

//High Calc

#include<iostream>

#include<cmath>

#include<iomanip>

using namespace std;

 

#define base      10000

#define base_len  4

#define array_len 20000

 

//int a[], a[0] is length, a[1] is low

 

template <class T>inline

T max(T i,T j){return i>j?i:j;}

template <class T>inline

T min(T i,T j){return i<j?i:j;}

 

void _plus (int *a,int *b,int *c);

void _minus(int *a,int *b,int *c);

void _mul  (int *a,int *b,int *c);

void _mul  (int *a,int  b,int *c);

void _fac  (int  n,int *a);

void _disp (int *a,ostream &os);

 

void main(){

       int a[array_len]={10,1234,4356,8986,4263,6648,3201,8045,4125,7654,4321};

       int b[array_len]={9,2343,4321,5463,4315,7641,543,4435,3423,5};

       int c[array_len];

       _disp(a,cout);

       cout<<'+';

       _disp(b,cout);

       cout<<'=';

       _plus(a,b,c);

       _disp(c,cout);

       cout<<endl<<endl;

 

       _disp(a,cout);

       cout<<'-';

       _disp(b,cout);

       cout<<'=';

       _minus(a,b,c);

       _disp(c,cout);

       cout<<endl<<endl;

 

       _disp(a,cout);

       cout<<"*178=";

       _mul(a,178,c);

       _disp(c,cout);

       cout<<endl<<endl;

 

       _disp(a,cout);

       cout<<'*';

       _disp(b,cout);

       cout<<'=';

       _mul(a,b,c);

       _disp(c,cout);

       cout<<endl<<endl;

 

       cout<<"123!=";

       _fac(123,c);

       _disp(c,cout);

       cout<<endl;

 

};

 

void _plus(int *a,int *b,int *c){

       int i,k,t,g=0;

       int *p;

       k=min(*a,*b);

       for(i=1;i<=k;i++){

              t=*(a+i)+*(b+i)+g;

              *(c+i)=t%base;

              g=t/base;

       }

       for(p=*a>*b?a:b,*c=k=max(*a,*b);i<=k;i++){

              t=*(p+i)+g;

              *(c+i)=t%base;

              g=t/base;

       }

       if(g)*(c+ ++(*c))=g;

}

void _minus(int *a,int *b,int *c){

       //a must bigger than b

       int i,k,t,g=0;

       k=*b;

       for(i=1;i<=k;i++){

              t=*(a+i)-*(b+i)-g;

              g=t<0;

              if(g)t+=base;

              *(c+i)=t;

       }

       for(*c=k=*a;i<=k;i++){

              t=*(a+i)-g;

              g=t<0;

              if(g)t+=base;

              *(c+i)=t;

       }

       while(!*(c+*c)&&*c>1)(*c)--;

}

void _mul(int *a,int *b,int *c){

       int t[array_len];

       memset(c,0,array_len);

       int i,k=*b;

       for(i=1;i<=k;i++){

              _mul(a,*(b+i),t);

              memcpy(t+i,t+1,*t*sizeof(int));

              memset(t+1,0,sizeof(int)*(i-1));

              *t+=i-1;

              _plus(t,c,c);

       }

}

void _mul(int *a,int b,int *c){

       int i,k,t,g=0;

       *c=k=*a;

       for(i=1;i<=k;i++){

              t=*(a+i)*b+g;

              *(c+i)=t%base;

              g=t/base;

       }

       if(g)*(c+ ++(*c))=g;

}

void _fac(int n,int *a){

       *a=*(a+1)=1;

       for(int i=1;i<=n;i++)

              _mul(a,i,a);

}

void _disp(int *a,ostream &os){

       int i,k=*a;

       os<<*(a+k)<<setfill('0');

       for(i=k-1;i>0;i--)

              os<<setw(base_len)<<*(a+i);

       os<<setfill(' ');

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值