string multiply(string num1, string num2) {
	const int M = num1.size(), N = (int)num2.size();
	string ans(M + N, 0); // 乘积最多M+N位
	
	for (auto &c : num1) c -= '0';
	for (auto &c : num2) c -= '0';
	// 将num1和num2从低位算起的第i1位和第i2位相乘,结果加到ans从低位算起的第i1+i2位
	// 换成从高位算起的视角,num1[M-1-i1] * num2[N-1-i2] +=> ans[M+N-1-(i1+i2)]
	// 设i=M-1-i1,j=N-1-i2,num1[i] * num2[j] +=> ans[i+j+1]
	for (int i = M - 1; i >= 0; i--) {
		for (int j = N - 1; j >= 0; j--) {
			int tmp = num1[i] * num2[j] + ans[i+j+1];
			ans[i+j+1] = tmp % 10;
			ans[i+j] += tmp / 10;
		}
	}
	for (auto &c : ans) c += '0';

	int i = 0;
	while (ans[i] == '0') i++;
	if (i == ans.size()) return "0";
	return ans.substr(i);
}