高精度模板Bigint Killer

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 }

 

转载于:https://www.cnblogs.com/algonote/p/6896625.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值