C++ 字符串乘法计算:代码错误分析及修复
#include
class math_tool { public: static void getvalue(const char *first, const char *second); };
void math_tool::getvalue(const char *first, const char *second) { int length1 = strlen(first); int length2 = strlen(second);
// 用于存储结果的数组,最大长度为 length1 + length2
int result[length1 + length2 + 1] = {0};
for (int i = 0; i < length1; i++)
{
for (int j = 0; j < length2; j++)
{
result[i + j + 1] += (first[i] - '0') * (second[j] - '0');
}
}
for (int i = length1 + length2; i >= 0; i--)
{
if (result[i] >= 10)
{
result[i - 1] += result[i] / 10;
result[i] %= 10;
}
}
// 打印结果
for (int i = 0; i < length1 + length2; i++)
{
std::cout << result[i];
}
std::cout << std::endl;
}
int main() { math_tool::getvalue('11', '11');
return 0;
}
这段代码的结果是0121是因为在计算结果时,没有考虑到进位的情况。
在计算两个数字的乘积时,每一位的乘积结果可能会大于10,需要将进位的部分加到前一位上。但是在这段代码中,只考虑了进位的情况,没有将进位加到前一位上,导致最后的结果不正确。
修复这个问题的方法是,在计算结果时,在每一次累加乘积结果时,将进位加到前一位上。具体的修复代码如下:
void math_tool::getvalue(const char *first, const char *second)
{
int length1 = strlen(first);
int length2 = strlen(second);
// 用于存储结果的数组,最大长度为 length1 + length2
int result[length1 + length2 + 1] = {0};
for (int i = 0; i < length1; i++)
{
for (int j = 0; j < length2; j++)
{
int product = (first[i] - '0') * (second[j] - '0');
result[i + j + 1] += product % 10; // 将乘积结果的个位数加到当前位置上
result[i + j] += product / 10; // 将乘积结果的十位数加到前一位上
}
}
for (int i = length1 + length2; i >= 0; i--)
{
if (result[i] >= 10)
{
result[i - 1] += result[i] / 10;
result[i] %= 10;
}
}
// 打印结果
for (int i = 0; i < length1 + length2; i++)
{
std::cout << result[i];
}
std::cout << std::endl;
}
使用修复后的代码,结果将会是22,而不是0121。
原文地址: https://www.cveoy.top/t/topic/o9cz 著作权归作者所有。请勿转载和采集!