目录
在执行高精度数运算时,因为溢出问题,整数不能直接用基本类型表示。通常思路是将整数存在字符串中,模拟算术运算进行处理,结果返回正确运算结果的字符串。
高精度加法
const int BASE = 10;//进制 为10则是以十进制运算
//返回a+b
string add(string a, string b)
{
string ret;
int index_a = a.size()-1, index_b = b.size()-1, carry = 0;
int add_a = 0, add_b = 0;
while (index_a>=0 || index_b >=0)
{
add_a = index_a >= 0 ? a[index_a--]-'0' : 0;
add_b = index_b >= 0 ? b[index_b--]-'0' : 0;
int sum = add_a + add_b + carry;
if (sum >= BASE)
{
carry = 1;
sum %= BASE;
}
else carry = 0;
ret.push_back(sum+'0');
}
if (carry) ret.push_back('1');
reverse(ret.begin(), ret.end());
return ret;
}
高精度减法
//比较 a,b的大小
int cmp(string a, string b)
{
if (a.size() != b.size()) return a.size() - b.size();
for (int i = 0; i < a.size(); i++)
if (a[i] != b[i]) return a[i] -= b[i];
return 0;
}
//返回 a-b 的值
string sub(string a, string b)
{
int flag = 0;
if (cmp(a, b) < 0)
{
swap(a, b);
flag = 1;
}
string ret;
if (cmp(a, b) == 0)
{
ret.push_back('0');
return ret;
}
int index_a = a.size() - 1, index_b = b.size() - 1;
int sub_a, sub_b, t = 0;
while (index_a >= 0)
{
sub_a = a[index_a--] - '0', sub_b = index_b>=0?b[index_b--] - '0':0;
int num =sub_a-t-sub_b;
if (num < 0)
{
num += BASE;
t = 1;
}
else t = 0;
ret.push_back(num + '0');
}
while (ret.size() > 1 && ret.back() == '0') ret.pop_back();
if(flag) ret.push_back('-');
reverse(ret.begin(), ret.end());
return ret;
}
高精度乘法
string mul(string a, int b)
{
string ret;
int t = 0;
for (int i = a.size() - 1; i >= 0 || t!=0; i--)
{
if (i >= 0) t += (a[i]-'0') * b;
ret.push_back(t%BASE+'0');
t /= BASE;
}
reverse(ret.begin(), ret.end());
return ret;
}
高精度除法
//返回a/b. c:余数
string div(string a, int b,int &c)
{
string ret;
int t = 0;
for (int i = 0; i <a.size(); i++)
{
t = t * BASE +(a[i]-'0');
ret.push_back(t / b+'0');
t %= b;
}
c = t;
reverse(ret.begin(), ret.end());
while (ret.size() > 1 && ret.back() == '0') ret.pop_back();
reverse(ret.begin(), ret.end());
return ret;
}