Problem: 43. 字符串相乘
问题
思路
用小学生算1234*567的方法,分解到最简的一步,然后把每一步用程序的语言进行实现:注意用下面的方法可以理解但是不太符合:
image.png
应该是第一次循环完毕后得到res={‘8’,‘3’,‘6’,‘8’}下一次的结果与res有关,要从第二位开始再加依次结束;不是先得到三个结果,然后再相加,实际是对两个单独的数进行处理然后加上进位和这个位上原本的值,然后把结果进行存储
Code
char* multiply(char* num1, char* num2) {
int k, t, fac, now, temp;
char* res = (char*)malloc(sizeof(char) * (strlen(num1) + strlen(num2) + 1));
memset(res, '0',sizeof(char) *(strlen(num1) + strlen(num2) + 1)); // 给分配的内存统一初始化
if (*num1 == '0' || *num2 == '0') // 排除0的情况
{
return "0";
}
for (int i = 0; i < strlen(num1); i++) {
fac = num1[strlen(num1) - 1 - i] - '0';
k = i;
t = 0;
for (int j = strlen(num2) - 1; j >= 0; j--) {
now = (res[k] - '0') + fac * (num2[j] - '0') + t; // 这个公式要自己动手算算,算两行就理解咋回事了
t = now / 10; // 进位
res[k] = now % 10 + '0';//5+‘0’==‘5’,‘5’-‘0’==5,常用的技巧
k++;
}
if (t >0) // 每次大循环一次就要进行一次彻底的进位,例如2*2=4,和2*6=12两种情况,第二种情况就要彻底的进位
{
res[k] = t + '0';
k++;
}
}
res[k] = '\0'; // 成为字符串数组
// 翻转显示:也是个小技巧,动手算算
for (int i = 0; i < (strlen(res)) / 2; i++) {
temp = res[i];
res[i] = res[k - i - 1];
res[k - i - 1] = temp;
}
return res;
}