我正在编写一个函数,将String中显示的Big Int(128位)数字除以2。 例如:8113是字符串=“ 8113” 在du!= 0的情况下,我知道我的函数错误。当我修复某个输入的代码时,其他输入就会出错。 请给我一些解决方案的建议。如果我的算法很糟糕,请告诉我更好的方法,然后我可以用另一种方式更改功能。
int CTOI(char a)
{
return a - 48;
}
char ITOC(int a)
{
if (a == 0)
return '0';
return a + '0';
}
int creDec(int a, int b)
{
return (a * 10) + b;
}
string divide2(string str)
{
string temp = str, t2;
int du, kq;
du = CTOI(temp[0]);
if (du == 1) {
temp.erase(0, 1);
while (temp[0] != 0)
{
du = creDec(du, CTOI(temp[0]));
if (du == 1)
{
temp.erase(0, 1);
}
else
temp.erase(0, 1);
kq = du / 2;
t2 += ITOC(kq);
du = du - kq * 2;
}
}
else
{
while (temp[0] != 0)
{
if (du == 1)
{
temp.erase(0, 1);
du = creDec(du, CTOI(temp[0]));
}
kq = du / 2;
t2 += ITOC(kq);
du = du - kq * 2;
temp.erase(0, 1);
du = creDec(du, CTOI(temp[0]));
}
}
return t2;
}
答案 0 :(得分:1)
您似乎为该功能添加了许多不必要的复杂性。这是一个简化的功能,适用于我的测试用例。
string divide2(string str)
{
string ret; // Object to be returned.
int rem = 0; // Keep track of remainders.
// Iterate over the characters of the input string.
auto iter = str.begin();
auto end = str.end();
for ( ; iter != end; ++iter )
{
int n1 = CTOI(*iter); // The number from the string.
int n2 = creDec(rem, n1); // The number after we account for the remainder.
int n3 = n2/2; // Result of the division.
rem = n2%2; // Remainder of the division.
if ( ret.empty() && n3 == 0 )
{
// Do nothing. There is no need to addd leading zeros to ret.
}
else
{
// Add the character corresponding to n3 to ret.
ret.push_back(ITOC(n3));
}
}
// If the return value is an empty string, return "0".
if ( ret.empty() )
{
return "0";
}
else
{
return ret;
}
}
最好还是使用range-for
循环遍历字符串的字符。
for ( char ch : str )
{
int n1 = CTOI(ch); // The number from the string.
...