高精度

  • 加法(两大数相加)
  • 减法(两大数相减)
  • 乘法(大数×小数)
  • 除法

##加法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <vector>
using namespace std;
const int N=1e5+10;
vector<int>ADD(vector<int>&A,vector<int>&B)
{
vector<int>C;
int t=0;
for(int i=0;i < A.size()||i < B.size();i++)
{
if(i < A.size()) t+=A[i];
if(i < B.size()) t+=B[i];
C.push_back(t%10);
t/=10;
}
if(t)
C.push_back(1);
while(C.size()>1&&C.back()==0) C.pop_back();
return C;
}
int main()
{
string a,b;
vector<int>A,B;
cin>>a>>b;
for(int i=a.size()-1;i>=0;i--)
A.push_back(a[i]-'0');
for(int i=b.size()-1;i>=0;i--)
B.push_back(b[i]-'0');
vector<int> C=ADD(A,B);
for(int i=C.size()-1;i>=0;i--)
printf("%d",C[i]);
}

##减法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <vector>
using namespace std;
bool cmp(vector<int>A,vector<int>B)//cmp==1 <==> A>=B
{
if(A.size()!=B.size()) return A.size()>B.size();//正整数
for(int i=A.size()-1;i>=0;i--)
{
if(A[i]!=B[i])
return A[i]>B[i];
}
return true;
}
vector<int>SUB(vector<int>A,vector<int>B)//默认A>B
{
int t=0;
vector<int>C;
for(int i=0;i<A.size();i++)
{
t+=A[i];
if(i<B.size()) t-=B[i];
C.push_back((t+10)%10);
if(t<0) t=-1;
else t=0;
}
while(C.size()>1&&C.back()==0) C.pop_back();
return C;
}
int main()
{
string a,b;
cin>>a>>b;
vector<int>A,B;
for(int i=a.size()-1;i>=0;i--)
A.push_back(a[i]-'0');
for(int i=b.size()-1;i>=0;i--)
B.push_back(b[i]-'0');
vector<int>C;
if(cmp(A,B)==true)
{
C=SUB(A,B);
for(int i=C.size()-1;i>=0;i--)
printf("%d",C[i]);
}
else
{
C=SUB(B,A);
cout<<"-";
for(int i=C.size()-1;i>=0;i--)
printf("%d",C[i]);
}
}

##乘法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <vector>
using namespace std;
const int N=1e5+10;
vector<int>MUL(vector<int>A,int b)
{
int t=0;
vector<int>C;
for(int i=0;i<A.size()||t;i++)
{
if(i<A.size()) t+=A[i]*b;
C.push_back(t%10);
t/=10;
}
while(C.size()>1&&C.back()==0) C.pop_back();
return C;
}
int main()
{
string a;
int b;
cin>>a>>b;
vector<int>A;
for(int i=a.size()-1;i>=0;i--)
A.push_back(a[i]-'0');
vector<int>C=MUL(A,b);
for(int i=C.size()-1;i>=0;i--)
printf("%d",C[i]);
}

##除法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int>div(vector<int>A,int b,int&r)
{
vector<int>C;
for(int i=A.size()-1;i>=0;i--)
{
r=r*10+A[i];
C.push_back(r/b);
r=r%b;
}
reverse(C.begin(),C.end());
while(C.size()>1&&C.back()==0) C.pop_back();
return C;
}
int main()
{
string a;
int b;
cin>>a>>b;
vector<int>A;
for(int i=a.size()-1;i>=0;i--)
A.push_back(a[i]-'0');
int r=0;
vector<int>C=div(A,b,r);
for(int i=C.size()-1;i>=0;i--)
printf("%d",C[i]);
cout<<endl<<r;
}