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(' ');
}