话不多说,这次写的是两个参数均是vector的高精度加减乘除,直接上代码:
vector<int> PlusH(vector<int>a, vector<int>b)//此参数的vector的a如果真实值为123那么vector里变成321
{
vector<int>c;
c.clear();
for (int i = 0, t = 0; i < a.size() || i < b.size() || t; i++)
{
if (i < a.size()) t += a[i];
if (i < b.size())t += b[i];
c.push_back(t % 10);
t = t / 10;
}
return c;//还是倒着的
}//时间复杂度为O(n)
vector<int> Plus(vector<int>a, int b)
{
vector<int>c;
c.clear();
a[0] += b;
for (int i = 0, t = 0; i < a.size() || t; i++)
{
t += a[i];
c.push_back(t % 10);
t = t/ 10;
}
return c;
}
vector<int> Mul(vector<int>a,int b)
{
vector<int> c;
if (b == 0)
{
c.push_back(0);
return c;
}
c.clear();
for (int i = 0, t = 0; i < a.size()||t; i++)
{
if (i < a.size()) t += b * a[i];
c.push_back(t % 10);
t = t / 10;
}
return c;
}//时间复杂度为O(n)
vector<int> mulH(vector<int>a, vector<int>b)
{
vector<int>c;
c.clear();
vector<int>d;
for (int i = 0; i < a.size()||d.size(); i++)
{
d = PlusH(d, Mul(b, a[i]));
c.push_back(d[0]);
d.erase(d.begin(), d.begin() + 1);
}
return c;
}//时间复杂度O(n^2)
vector<int> reduceH(vector<int>a, vector<int>b)
{
vector<int>c;
c.clear();
if (a.size() > b.size())//最后的值大于零
{
for (int i = 0,t=0; i < a.size(); i++)
{
a[i] += t;
int d;
if (a[i] < b[i])
{
d = abs(a[i] - b[i]);
t--;
}
else
d = a[i] - b[i];
c.push_back(d);
}
if (c[c.size() - 1] == 0)//去除末尾0
c.erase(c.end() - 1, c.end());
}
else if (a.size() < b.size())//最后的值小于零
{
for (int i = 0, t = 0; i < b.size(); i++)
{
b[i] += t;
int d;
if (b[i] < a[i])
{
d = abs(a[i] - b[i]);
t--;
}
else
d = b[i] - a[i];
c.push_back(d);
}
if (c[c.size() - 1] == 0)
c.erase(c.end() - 1, c.end());
c[c.size() - 1] = -c[c.size() - 1];
}
else //两个位数相同通过比较得出答案
{
int i;
for (i = a.size() - 1; i >= 0; i--)
{
if (a[i] != b[i])//找到从最高位开始的第一个不同的数
break;
}
if (a[i] > b[i])//a的值大于b的值
{
for (int j = 0,t=0; j <= i; j++)
{
a[j] += t;
if (a[j] < b[j]) t--;
c.push_back(abs(a[j] - b[j]));
}
if (c[c.size() - 1] == 0)
c.erase(c.end() - 1, c.end());
}
else//a的值小于b的值
{
for (int j = 0, t = 0; j <= i; j++)
{
b[j] += t;
if (b[j] < a[j]) t--;
c.push_back(abs(b[j] - a[j]));
}
if (c[c.size() - 1] == 0)
c.erase(c.end() - 1, c.end());
c[c.size() - 1] = -c[c.size() - 1];
}
}
return c;
}
vector<int> MaxH(vector<int>a, vector<int>b)
{
if (a.size() > b.size()) return a;
else if (a.size() < b.size()) return b;
else
{
for (int i = a.size() - 1; i >= 0; i--)
{
if (a[i] > b[i])
return a;
else if (a[i] < b[i])
return b;
}
return a;
}
}