#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),用于存储结果