一、高精度加法
高精度加法是模拟竖式运算得来,总结如下:
1.对字符串进行预处理
2.两个数组对应位置分别相加
3.从低位到高位扫描一遍,超过进制的向上进位
4.如果最高位大于进制,则向上进位
1 string s1,s2;
2 int a[10001],b[10001],c[10001]={};
3 int la,lb,lc;
4 void high_precision_addition()
5 {
6 if(s1<s2)
7 {
8 swap(s1,s2);
9 }
10 la=s1.length();
11 lb=s2.length();
12 for(int i=0;i<la;i++)
13 {
14 a[la-i]=s1[i]-'0';
15 }
16 for(int i=0;i<lb;i++)
17 {
18 b[lb-i]=s2[i]-'0';
19 }
20 lc=la;
21 for(int i=1;i<=lb;i++)
22 {
23 c[i]=a[i]+b[i];
24 }
25 for(int i=lb+1;i<=la;i++)
26 {
27 c[i]=a[i];
28 }
29 for(int i=1;i<lc;i++)
30 {
31 if(c[i]>=10)
32 {
33 c[i+1]+=c[i]/10;
34 c[i]%=10;
35 }
36 }
37 while(c[lc]>=10)
38 {
39 lc+=1;
40 c[lc]=c[lc-1]/10;
41 c[lc-1]%=10;
42 }
43 return;
44 }
二、高精度减法
1.对字符串进行预处理,判断正负,记录正负号,调整被减数和减数,使得被减数不小于减数
2.对应位置分别相减
3.从低位到高位扫描,小于0的向上一位借1
4.如果最高位是0,减小结果长度lc
1 string s1,s2;
2 bool negative;
3 int a[10001],b[10001],c[10001]={};
4 int la,lb,lc;
5 void high_precision_subtraction()
6 {
7 negative=false;
8 if(s1.length()<s2.length())
9 {
10 swap(s1,s2);
11 negative=true;
12 }
13 if(s1.length()==s2.length())
14 {
15 if(s1<s2)
16 {
17 swap(s1,s2);
18 negative=true;
19 }
20 }
21 la=s1.length();
22 lb=s2.length();
23 lc=la;
24 for(int i=0;i<la;i++)
25 {
26 a[la-i]=s1[i]-'0';
27 }
28 for(int i=0;i<lb;i++)
29 {
30 b[lb-i]=s2[i]-'0';
31 }
32 for(int i=1;i<=lb;i++)
33 {
34 c[i]=a[i]-b[i];
35 }
36 for(int i=lb+1;i<=la;i++)
37 {
38 c[i]=a[i];
39 }
40 for(int i=1;i<lc;i++)
41 {
42 while(c[i]<0)
43 {
44 c[i+1]-=1;
45 c[i]+=10;
46 }
47 }
48 while(c[lc]==0&&lc>0)
49 {
50 lc-=1;
51 }
52 if(lc==0)
53 {
54 lc=1;
55 }
56 return;
57 }
三、高精度乘法
1 string s1,s2;
2 int a[10001],b[10001],c[10001]={};
3 int la,lb,lc;
4 void high_precision_multiplication()
5 {
6 if(s1<s2)
7 {
8 swap(s1,s2);
9 }
10 la=s1.length();
11 lb=s2.length();
12 for(int i=0;i<la;i++)
13 {
14 a[la-i]=s1[i]-'0';
15 }
16 for(int i=0;i<lb;i++)
17 {
18 b[lb-i]=s2[i]-'0';
19 }
20 lc=la+lb-1;
21 for(int i=1;i<=lb;i++)
22 {
23 for(int j=0;j<la;j++)
24 {
25 c[i+j]+=a[j+1]*b[i];
26 }
27 }
28 for(int i=1;i<lc;i++)
29 {
30 if(c[i]>=10)
31 {
32 c[i+1]+=c[i]/10;
33 c[i]%=10;
34 }
35 }
36 while(c[lc]>=10)
37 {
38 lc++;
39 c[lc]=c[lc-1]/10;
40 c[lc-1]%=10;
41 }
42 return;
43 }
四、高精度除法
1 string s1,s2;
2 int a[10001],b[10001],c[10001]={};
3 int la,lb,lc;
4 long long division;
5 void subtraction()
6 {
7 for(int i=1;i<=lb;i++)
8 {
9 c[i]=a[i]-b[i];
10 }
11 for(int i=lb+1;i<=la;i++)
12 {
13 c[i]=a[i];
14 }
15 for(int i=1;i<lc;i++)
16 {
17 while(c[i]<0)
18 {
19 c[i+1]-=1;
20 c[i]+=10;
21 }
22 }
23 while(c[lc]==0&&lc>0)
24 {
25 lc-=1;
26 }
27 if(lc==0)
28 {
29 lc=1;
30 }
31 return;
32 }
33 void high_precision_division()
34 {
35 if(s1.length()<s2.length())
36 {
37 lc=1;
38 return;
39 }
40 if(s1.length()==s2.length()&&s1<s2)
41 {
42 lc=1;
43 return;
44 }
45 la=s1.length();
46 lb=s2.length();
47 lc=la;
48 for(int i=0;i<la;i++)
49 {
50 a[la-i]=s1[i]-'0';
51 }
52 for(int i=0;i<lb;i++)
53 {
54 b[lb-i]=s2[i]-'0';
55 }
56 division=0;
57 while(true)
58 {
59 subtraction();
60 division+=1;
61 for(int i=1;i<=lc;i++)
62 {
63 a[i]=c[i];
64 c[i]=0;
65 }
66 la=lc;
67 if(la<lb)
68 {
69 break;
70 }
71 if(la==lb)
72 {
73 int tmpa=la,tmpb=lb;
74 bool flag=false;
75 while(tmpa>=1&&tmpb>=1)
76 {
77 if(a[tmpa]<b[tmpb])
78 {
79 flag=true;
80 break;
81 }
82 tmpa-=1;
83 tmpb-=1;
84 }
85 if(flag)
86 {
87 break;
88 }
89 }
90 }
91 return;
92 }
五、高精度取余
1 string s1,s2;
2 int a[10001],b[10001],c[10001]={};
3 int la,lb,lc;
4 void subtraction()
5 {
6 for(int i=1;i<=lb;i++)
7 {
8 c[i]=a[i]-b[i];
9 }
10 for(int i=lb+1;i<=la;i++)
11 {
12 c[i]=a[i];
13 }
14 for(int i=1;i<lc;i++)
15 {
16 while(c[i]<0)
17 {
18 c[i+1]-=1;
19 c[i]+=10;
20 }
21 }
22 while(c[lc]==0&&lc>0)
23 {
24 lc-=1;
25 }
26 if(lc==0)
27 {
28 lc=1;
29 }
30 return;
31 }
32 void high_precision_redundancy()
33 {
34 la=s1.length();
35 lb=s2.length();
36 lc=la;
37 for(int i=0;i<la;i++)
38 {
39 a[la-i]=s1[i]-'0';
40 }
41 for(int i=0;i<lb;i++)
42 {
43 b[lb-i]=s2[i]-'0';
44 }
45 if(s1.length()<s2.length())
46 {
47 for(int i=1;i<=la;i++)
48 {
49 c[i]=a[i];
50 }
51 return;
52 }
53 if(s1.length()==s2.length()&&s1<s2)
54 {
55 for(int i=1;i<=la;i++)
56 {
57 c[i]=a[i];
58 }
59 return;
60 }
61 while(true)
62 {
63 subtraction();
64 for(int i=1;i<=lc;i++)
65 {
66 a[i]=c[i];
67 c[i]=0;
68 }
69 la=lc;
70 if(la<lb)
71 {
72 break;
73 }
74 if(la==lb)
75 {
76 int tmpa=la,tmpb=lb;
77 bool flag=false;
78 while(tmpa>=1&&tmpb>=1)
79 {
80 if(a[tmpa]<b[tmpb])
81 {
82 flag=true;
83 break;
84 }
85 tmpa-=1;
86 tmpb-=1;
87 }
88 if(flag)
89 {
90 break;
91 }
92 }
93 }
94 return;
95 }