#include <iostream>
using namespace std;
int main() {
string str1, str2;
while (cin >> str1 >> str2) {
long len1 = str1.size();
long len2 = str2.size();
long len = len1 + len2;
string ans(len, '0');
int carry = 0; // 进位
int shift = 0; // 移位
int i = 0, j = 0; // i遍历str1,j遍历str2
int num1 = 0, num2 = 0; // num1,num2分别表示str1,str2当前位置上的数,
int ansCurr = 0, mulCurr; // 分别表示 答案当前位置上的数 和 当前位置相乘的结果
for (i = 0; i < len2; i++) {
carry = 0; // 进位重置
num2 = str2[len2 - i - 1] - '0'; // 取出str2当前位置的数
for (j = 0; j < len1; j++) { // 对于str1的每一位
num1 = str1[len1 - j - 1] - '0'; // 取出str1当前位置的数
ansCurr = ans[len - shift - j - 1] - '0'; // 取出ans当前位置的数
mulCurr = num1 * num2 + ansCurr + carry; // 当前位置的相乘结果
carry = mulCurr / 10; // 计算进位
ans[len - shift - j - 1] = mulCurr % 10 + '0'; // 当前位置应填入的数
}
// 如果还有进位,直接填入对应位置
if (carry != 0) {
ans[len - shift - j - 1] = carry + '0';
}
// 移位加1,进入下一轮
shift++;
}
// 抹除前0
if (ans[0] == '0') {
ans.erase(0, 1);
}
cout << ans << endl;
}
return 0;
}
时间复杂度:O(len1*len2),用于遍历并计算两数相乘
空间复杂度:O(len1+len2),用于存储结果

京公网安备 11010502036488号