高精度加法:
vector<int> add(vector<int> &a, vector<int> &b)
{
vector<int> c;
int temp = 0;
for(int i=0; i<(int)a.size() || i<(int)b.size(); i++)
{
if(i <(int) a.size()) temp += a[i];
if(i <(int)b.size()) temp += b[i];
c.push_back(temp%10);
temp /= 10;
}
if(temp) c.push_back(temp);
reverse(c.begin(), c.end());
return c;
}
高精度减法:
#include <bits/stdc++.h>
#define rep(x, a, b) for(int x = a; x<=b; x++)
#define pre(x, a, b) for(int x=a; x>=b; x--)
using namespace std;
bool cmp(vector<int> &a, vector<int> &b)//判断数字大小
{
if(a.size() != b.size()) return a.size()>b.size();
for(int i=(int)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)
{
vector<int> c;
if(!cmp(a, b))//判断减数和被减数的大小
{
printf("-");//提前输出负号
c = sub(b, a);//交换位置再次调用
return c;
}
int temp = 0;
for(int i=0; i<(int)a.size(); i++)
{
temp += a[i];
if(i < (int)b.size()) temp -= b[i];
c.push_back((temp+10)%10);//保证压入的数字为个位正整数
if(temp < 0) temp = -1;
else temp = 0;
}
while(c.size()>1 && c.back() == 0) c.pop_back();//去除前导零
reverse(c.begin(), c.end());//倒置
return c;
}
高精度乘法:
vector<int> mul(vector<int> &a,int b)
{
vector<int> c;
int temp = 0;
for(int i=0; i<(int)a.size(); i++)
{
temp += a[i]*b;
c.push_back(temp%10);
temp /= 10;
}
if(temp) c.push_back(temp);
while(c.size()>1 && c.back() == 0) c.pop_back();
reverse(c.begin(), c.end());
return c;
}
高精度除法:
vector<int> div(vector<int> &a,int b, int &temp)
{
vector<int> c;
reverse(a.begin(), a.end());
for(int i=0; i<(int)a.size(); i++)
{
temp = temp*10 + a[i];//上一位的余数*10+该位数字
c.push_back(temp/b);//除数
temp %= b;//注意是模b取余数
}
reverse(c.begin(), c.end());//倒置
while(c.size()>1 && c.back() == 0) c.pop_back();//去前缀0
reverse(c.begin(), c.end());//倒置回去
return c;
}