50行内实现高精度&高精度、高精度&低精度的四则运算,并且运算模块相互独立,可以根据需求进行删减。
运算结果可以直接存储在第一个操作数中(不能是第二个),如a/=b可以直接写成div(a,b,a),无需经过第三个变量中转,其余的运算类似。
如有错误欢迎指出。
1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 int t[1010]; 5 void r(int *a) { //高精度输入 6 string b;cin>>b; 7 a[0]=b.length(); 8 for (int i=1;i<=a[0];i++) a[i]=b[a[0]-i]-'0'; 9 } 10 void w(int *a) {for (int i=a[0];i>=1;i--) cout<<a[i];cout<<endl;} //高精度输出 11 void clz(int *a) {while (a[a[0]]==0&&a[0]>1) a[0]--;} //去除前导零 12 void cls(int *a) {memset(a,0,sizeof(int)*(a[0]+1));} //高精度清零 13 void cpy(int *a,int *b) {memcpy(b,a,sizeof(int)*(a[0]+1));} //高精度复制 14 bool cmp(int *a,int *b) { //高精度比较 15 if (a[0]!=b[0]) return a[0]>b[0]; 16 for (int i=a[0];i>=1;i--) if (a[i]!=b[i]) return a[i]>b[i]; 17 } 18 void calc(int *a,int *b,int *c,int l,int w) { //高精度运算核心 19 int x=0; 20 for (int i=0;i<l;i++) x=(c[i]=a[i]+w*b[i]+10+x)/10-1,c[i]%=10; 21 c[l]=x; 22 } 23 void add(int *a,int *b,int *c) {calc(a+1,b+1,c+1,c[0]=max(a[0],b[0])+1,1);clz(c);} //高精度加高精度 24 void sub(int *a,int *b,int *c) {calc(a+1,b+1,c+1,c[0]=a[0],-1);clz(c);} //高精度减高精度 25 void mul(int *a,int *b,int *c) { //高精度乘高精度 26 if (a==c) {cpy(a,t);a=t;} 27 cls(c);c[0]=a[0]+b[0]; 28 for (int i=1;i<=a[0];i++) calc(c+i,b+1,c+i,b[0],a[i]); 29 clz(c); 30 } 31 void div(int *a,int *b,int *c) { //高精度除高精度 32 cpy(a,t);cls(c);c[0]=t[0]-b[0]+1; 33 for (int i=c[0];i>=1;i--) { 34 while (t[i+b[0]]>=0) {calc(t+i,b+1,t+i,b[0],-1);c[i]++;} 35 calc(t+i,b+1,t+i,b[0],1); 36 c[i]--;t[0]=i+b[0];clz(a); 37 } 38 clz(c); 39 } 40 void dmul(int *a,int b,int *c) { //高精度乘低精度 41 int i=1,x=0; 42 while (i<=a[0]||x) x=(c[i]=a[i]*b+x)/10,c[i++]%=10; 43 c[i]=x;c[0]=i;clz(c); 44 } 45 void ddiv(int *a,int b,int *c) { //高精度除低精度 46 int x=0;c[0]=a[0]; 47 for (int i=a[0];i>=1;i--) x=(c[i]=a[i]+x)%b*10,c[i]/=b; 48 clz(c); 49 } 50 int a[100],b[100],c,d[100]; 51 int main() 52 { 53 ios::sync_with_stdio(false); 54 cout<<"输入两个高精度数(a>=b)"<<endl; 55 r(a);r(b); 56 if (cmp(b,a)) {cout<<"输入错误"<<endl;return 0;} 57 add(a,b,d);cout<<"a+b=";w(d); 58 sub(a,b,d);cout<<"a-b=";w(d); 59 mul(a,b,d);cout<<"a*b=";w(d); 60 div(a,b,d);cout<<"a/b=";w(d); 61 cout<<"输入一个低精度数c"<<endl; 62 cin>>c; 63 dmul(a,c,d);cout<<"a*c=";w(d); 64 ddiv(a,c,d);cout<<"a/c=";w(d); 65 return 0; 66 }