如题,我的高精度基本就是照着大佬的代码写的,按照我个人的习惯做了些许的修改(修改了变量名和一些运算,原来除法的函数我把它分成了做整除和取模),结果就不对了
貌似是dynamic_dividend(相当于原来代码的tempstr)这个变量出了问题,自己在调试时输出这个变量得到的是空字符串。
求解
#include <iostream>
#include <string>
using namespace std;
int cmp(string, string);
string add(string, string);
string sub(string, string);
string mul(string, string);
string div(string, string);
string mod(string, string);
int main()
{
std:
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
string a, b;
cin >> a >> b;
cout << add(a, b) << "\n"
<< sub(a, b) << "\n"
<< mul(a, b) << "\n"
<< div(a, b) << "\n"
<< mod(a, b) << "\n";
return 0;
}
int cmp(string str1, string str2)
{
if (str1.length() < str2.length())
return -1;
if (str1.length() > str2.length())
return 1;
return str1.compare(str2);
}
string add(string str1, string str2)
{
string str = "";
int str1_len = str1.length(), str2_len = str2.length(), temp = 0;
bool carry = 0;
if (str1_len < str2_len)
for (int i = 1; i <= str2_len - str1_len; i++)
str1 = '0' + str1;
else
for (int i = 1; i <= str1_len - str2_len; i++)
str2 = '0' + str2;
str1_len = str1.length(), str2_len = str.length();
for (int i = str1_len - 1; i >= 0; i--)
{
temp = str1[i] - '0' + str2[i] - '0' + carry;
carry = temp / 10;
temp %= 10;
str = char(temp + '0') + str;
}
if (carry == 1)
str = '1' + str;
return str;
}
string sub(string str1, string str2)
{
string str = "";
int str1_len = str1.length(), str2_len = str2.length(), temp = 0;
bool carry = 0;
if (str1_len < str2_len)
for (int i = 1; i <= str2_len - str1_len; i++)
str1 = '0' + str1;
else
for (int i = 1; i <= str1_len - str2_len; i++)
str2 = '0' + str2;
str1_len = str1.length(), str2_len = str2.length();
for (int i = str1_len - 1; i >= 0; i--)
{
temp = (str1[i] - '0') - (str2[i] - '0') - carry;
if (temp < 0)
{
carry = 1;
temp += 10;
}
else
carry = 0;
str = char(temp + '0') + str;
}
str.erase(0, str.find_first_not_of('0'));
if (str.empty())
str = "0";
return str;
}
string mul(string str1, string str2)
{
string str = "", temp_num = "";
int carry = 0, temp_digit = 0;
int str1_len = str1.length(), str2_len = str2.length();
for (int i = str2_len - 1; i >= 0; i--)
{
temp_num = "";
temp_num.insert(0, str2_len - 1 - i, '0');
for (int j = str1_len - 1; j >= 0; j--)
{
temp_digit = (str2[i] - '0') * (str1[j] - '0') + carry;
carry = temp_digit / 10;
temp_digit %= 10;
temp_num = char(temp_digit + '0') + temp_num;
}
if (carry != 0)
temp_num = char(carry + '0') + temp_num;
str = add(str, temp_num);
}
str.erase(0, str.find_first_not_of('0'));
if (str.empty())
str = "0";
return str;
}
string div(string str1, string str2)
{
string str = "";
int str1_len = str1.length(), str2_len = str2.length();
if (str2 == "0")
str = "ERROR";
else if (str1 == "0")
str = "0";
else if (cmp(str1, str2) < 0)
str = "0";
else if (cmp(str1, str2) == 0)
str = "1";
else
{
string dynamic_dividend = "";
dynamic_dividend.append(str1, 0, str2_len - 1);
for (int i = str2_len - 1; i < str1_len; i++)
{
dynamic_dividend += str1[i];
dynamic_dividend.erase(0, dynamic_dividend.find_first_not_of('0'));
if (dynamic_dividend.empty())
dynamic_dividend = "0";
for (char ch = '9'; ch >= '0'; ch--)
{
string temp = mul(str2, ("" + ch));
if (cmp(temp, dynamic_dividend) <= 0)
{
str += ch;
dynamic_dividend = sub(dynamic_dividend, temp);
break;
}
}
}
str.erase(0, str.find_first_not_of('0'));
if (str.empty())
str = "0";
}
return str;
}
string mod(string str1, string str2)
{
string str;
str = sub(str1, mul(div(str1, str2), str2));
return str;
}