- 题目:
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。 - 解题思路:
这种题目就是找规律,解题的关键钥匙就是:num1的第i位(高位从0开始) 和 num2 的第j位 相乘的结果在乘积中的位置是([i+j,i+j+1]),这样我们就可以用两个循环,从高位(index大的位置)开始,依次相乘得到temp,应为i,j位置的乘积结果保存的位置是[i+j,i+j+1],所以先用temp加上mul[i+j+1] 位置的值,这样就能实现进位。mul[i+j] += temp /10;
mul[i+j+1] = temp %10; - 解题代码:
class Solution {
public:
string multiply(string num1, string num2) {
//解题的关键思路
//num1的第i位(高位从0开始) 和 num2 的第j位 相乘的结果在乘积中的位置是([i+j,i+j+1])
int l1 = num1.length()-1;
int l2 = num2.length()-1;
//cout << l1 <<"," <<l2 <<endl;
if(l1 < 0 || l2 < 0){
return "";
}
int mul[l1+l2+2]; //c++定义数组的方法
int temp = 0;
//这一步必不可少
memset(mul,0,(l1+l2+2)*sizeof(int));
for(int i = l1 ; i >= 0 ;i--){
for(int j = l2; j >=0 ;j--){
temp = (num1[i] - '0') * (num2[j] - '0');
//cout << temp<<endl;
//必须先要加上低位之后再进行是否进位的判断
temp = mul[i+j+1] + temp;
mul[i+j] += temp / 10;
mul[i+j+1] = temp % 10;
}
}
string sum ;
//去掉前导的0
int i = 0;
while(mul[i] == 0 && i < l1+l2+1){
i++;
}
for(i;i < l1+l2+2 ;i++){
if(mul[i] > 9){
sum += mul[i]/10 + '0';
sum += mul[i]%10 + '0';
}else{
sum += mul[i] + '0';
}
}
return sum;
}
};
- tips:
char 与 int 的相互转换:
char -> int : char - ‘0’;
int -> char: int + ‘0’;
memset()的使用:
最后一个参数是字节数,而不是数组的长度。
在c++定义数组的时候可以配合初始化。
(1)int array[10];
(2)int* array = new int[n];(利用指针)。释放内存:delete[] array;