太大的数字用数组来存,从前往后是个十百千位
1,好进位,2,直接下标是几代表十的几次方
记住ASCII码 'A' = 65,'a' = 97,'0' = 48
高精度加法
#include <iostream>
#include <vector>
using namespace std;
int n,m;
const int N = 1e6+10;
int q[N],temp[N];
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 = t / 10;
}
if (t / 10)
c.push_back(1);
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');//要存放的是阿拉伯数字而不是字母,所以要减去'0'
for (int i = b.size() - 1; i >= 0; i--)
B.push_back(b[i] - '0');
auto c = add(A, B); //auto自动识别类型
for (int i = c.size() - 1; i >= 0; i--)
printf("%d", c[i]);
return 0;
}
高精度减法
#include <iostream>
#include <vector>
using namespace std;
int n,m;
const int N = 1e6+10;
int q[N],temp[N];
//判断是否a>=b
bool camp(vector<int>& a, vector<int>& b)
{
if (a.size() != b.size())
return a.size() > b.size();
else
for (int i = a.size(); i >= 0; i--)
if (a[i] != b[i])
return a[i] > b[i];
return true;
}
vector<int> sub(vector<int>& a, vector<int>& b)
{
vector<int> c;
for (int i = 0, k = 0; i < a.size(); i++)
{
k = a[i] - k;
if (i < b.size())
k -= b[i];
c.push_back((k + 10) % 10);
if (k < 0)
k = 1;
else
k = 0;
}
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');
if (camp(A, B))
{
auto c = sub(A, B);
for (int i = c.size() - 1; i >= 0; i--)
printf("%d", c[i]);
}
else
{
auto c = sub(B, A);
printf("-");
for (int i = c.size() - 1; i >= 0; i--)
printf("%d", c[i]);
}
return 0;
}
高精度乘法
#include <iostream>
#include <vector>
using namespace std;
int n,m;
const int N = 1e6+10;
int q[N],temp[N];
vector<int> mul(vector<int>& a,int b)
{
vector<int> c;
int t = 0;
for (int i = 0; i < a.size() || t != 0; i++)
{
if (i < a.size())
t += a[i]*b;
c.push_back(t % 10);
t = t / 10;
}
return c;
}
int main()
{
string a;
int b;
vector<int> A;
cin >> a >> b;
for (int i = a.size() - 1; i >= 0; i--)
A.push_back(a[i] - '0');
vector<int> C;
C = mul(A, b);
for (int i = C.size() - 1; i > 0; i--)
{
if (C[i] == 0)
C.pop_back();
else
break;
}
for (int i = C.size() - 1; i >= 0; i--)
printf("%d", C[i]);
return 0;
}
高精度除法
#include <iostream>
#include <vector>
#include<algorithm>
using namespace std;
int n,m;
const int N = 1e6+10;
int q[N],temp[N];
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());
for (int i = c.size() - 1; i > 0; i--)
{
if (c.back() == 0)
c.pop_back();
}
return c;
}
int main()
{
string a;
int b;
vector<int> A;
cin >> a >> b;
for (int i = a.size() - 1; i >= 0; i--)
A.push_back(a[i] - '0');
vector<int> C;
int r = 0;
C = div(A, b,r);
for (int i = C.size() - 1; i >= 0; i--)
printf("%d", C[i]);
cout << endl << r << endl;
return 0;
}
要搞清楚数字是怎么排放存储的,这一点上容易出岔子