我想要实现一个高精度除以高精度的程序,但是这个程序无法通过这个样例:
#1
输入
2147483648
2
期待输出
1073741824
你的输出
15073741824
#include <iostream>
#include <string>
using namespace std;
string a, b; // 高精度数
// 高精度减法
string subtract(string a, string b)
{
string result = "";
int carry = 0;
// 从最低位开始逐位相减
while (!a.empty() || !b.empty())
{
int digit_a = 0, digit_b = 0;
if (!a.empty())
{
digit_a = a.back()-'0';
a.pop_back();
}
if (!b.empty())
{
digit_b = b.back()-'0';
b.pop_back();
}
int diff = digit_a-digit_b-carry;
if (diff < 0)
{
diff += 10;
carry = 1;
}
else
{
carry = 0;
}
// 将计算得到的差值加入到结果中
result = to_string(diff) + result;
}
// 去除结果中的前导零
while (result.front()=='0' && result.length()>1)
result = result.substr(1);
return result;
}
// 判断a是否小于b
bool isLess(string a, string b)
{
if (a.length() < b.length())
return true;
else if (a.length() > b.length())
return false;
else
for (int i = 0; i < a.length(); i++)
if (a[i] < b[i])
return true;
else if (a[i] > b[i])
return false;
return false;
}
// 高精度除法
string divide(string a, string b)
{
string ans = ""; // 商
string rem = ""; // 余数
for (int i = 0; i < a.length(); i++)
{
rem += a[i];
int cnt = 0;
// 不断减去除数,直到无法继续减去为止
while (!isLess(rem, b))
{
rem = subtract(rem, b);
cnt++;
}
// 将当前的商的位数加入到商中
ans += to_string(cnt);
}
// 去前导零
while (ans.front()=='0' && ans.length()>1)
ans = ans.substr(1);
return ans;
}
int main()
{
cin >> a >> b;
if (b == "1")
{
cout << a;
return 0;
}
cout << divide(a, b);
return 0;
}