逆序
void reverse(string &s)
{
for (int i = 0; i < s.size() / 2; i++)
{
char t = s[i];
s[i] = s[s.size() - 1 - i];
s[s.size() - 1 - i] = t;
}
}
高精度加法
高精
+ 高精
string ans;
void add(string a, string b)
{
ans.clear();
reverse(a), reverse(b);
char t = 0;
for (int i = 0; i < a.size() || i < b.size(); i++)
{
if (i < a.size())
t += a[i] - '0';
if (i < b.size())
t += b[i] - '0';
ans.push_back(t % 10 + '0');
t = t / 10;
}
if (t > 0) // 处理进位
ans.push_back(t + '0');
reverse(ans);
}
高精度减法
高精
- 高精
string ans;
bool cmp(string a, string b)
{
if (a.size() != b.size())
return a.size() > b.size();
else
return a >= b;
}
void subtract(string a, string b)
{
ans.clear();
bool flag = false;
if (!cmp(a, b)) // a - b 可能为负数
{
flag = true;
swap(a, b);
}
reverse(a), reverse(b);
char t = 0;
for (int i = 0; i < a.size(); i++)
{
t = a[i] - '0' - t;
if (i < b.size())
t -= b[i] - '0';
ans.push_back((t + 10) % 10 + '0');
if (t < 0)
t = 1;
else
t = 0;
}
while (ans.size() > 1 && ans.back() == '0') // 处理前导0
ans.pop_back();
if (flag) // a - b 为负数,添加负号
ans.push_back('-');
reverse(ans);
}
高精度乘法
高精度
* 高精度
string ans;
void multiply(string a, string b)
{
ans.clear();
reverse(a), reverse(b);
ans.resize(a.size() + b.size(), '0'); // 乘法结果的位数最多为两个乘数的位数之和
for (int i = 0; i < a.size(); i++)
{
int t = 0, j;
for (j = 0; j < b.size(); j++) // a的每一位与b分别相乘
{
t += (a[i] - '0') * (b[j] - '0') + ans[j + i] - '0'; // 乘法存在错位
ans[j + i] = t % 10 + '0';
t /= 10;
}
if (t > 0) // 处理进位
ans[j + i] = t + '0';
}
while (ans.size() > 1 && ans.back() == '0') // 处理前导0
ans.pop_back();
reverse(ans);
}
高精度除法
高精
/ 低精
string ans, rem; // rem 为余数
void divid(string a, int b)
{
ans.clear();
int t = 0;
for (int i = 0; i < a.size(); i++)
{
t = 10 * t + a[i] - '0';
ans.push_back(t / b + '0');
t %= b;
}
if (t == 0) // 余数为0
rem.push_back('0');
while (t) // 余数放入rem中
{
rem.push_back(t % 10 + '0');
t /= 10;
}
reverse(ans);
while (ans.size() > 1 && ans.back() == '0') // 处理前导0
ans.pop_back();
reverse(ans), reverse(rem);
}
完
标签:10,reverse,运算,高精度,back,ans,string,size From: https://www.cnblogs.com/hoyd/p/18007599