LeetCode 43. 字串相乘 Multiply Strings(C語言)
阿新 • • 發佈:2018-12-24
題目描述:
給定兩個以字串形式表示的非負整數 num1 和 num2,返回 num1 和 num2 的乘積,它們的乘積也表示為字串形式。
示例 1:
輸入: num1 = “2”, num2 = “3”
輸出: “6”
示例 2:
輸入: num1 = “123”, num2 = “456”
輸出: “56088”
說明:
- num1 和 num2 的長度小於110。
- num1 和 num2 只包含數字 0-9。
- num1 和 num2 均不以零開頭,除非是數字 0 本身。
- 不能使用任何標準庫的大數型別(比如 BigInteger)或直接將輸入轉換為整數來處理。
題目解答:
方法1:暴力法
取字串2的每一個字元與字串1相乘,計算其結果,並將其依次累加,得到其乘積,但較複雜。
執行時間8ms,程式碼如下。
void multi(char* num, int t, int len, char* temp) {
if(t == 0) {
temp[0] = 0;
return;
}
int i = 0, flag = 0, tmp = 0, j = 0;
for(i = len - 1; i >= 0; i--) {
tmp = (num[i] - '0') * t + flag;
if(tmp >= 10) {
flag = tmp / 10;
temp[j++] = '0' + (tmp % 10);
}
else {
flag = 0;
temp[j++] = '0' + tmp;
}
}
temp[j] = flag ? (flag + '0') : 0;
return;
}
void reverse(char* s, int len) {
int i = 0;
char t = 0;
for(i = 0; i < len / 2; i++) {
t = s[i];
s[i] = s[len - 1 - i];
s[len - 1 - i] = t;
}
}
char* multiply(char* num1, char* num2) {
char* result = (char*)calloc(220, sizeof(char));
char* temp = (char*)calloc(220, sizeof(char));
char* temp2 = (char*)calloc(220, sizeof(char));
result[0] = '0';
if(num1 == NULL || num2 == NULL || num1[0] == '0' || num2[0] == '0')
return result;
int l1 = strlen(num1);
int l2 = strlen(num2);
int i = 0, t = 0, j = 0, l = 0, k = 0, flag = 0;
for(i = l2 - 1; i >= 0; i--) {
for(j = 0; j < l2 - 1 - i; j++)
temp[j] = '0';
multi(num1, num2[i] - '0', l1, temp + j);
j = 0;
k = 0;
l = 0;
while(temp[j] || result[k] || flag) {
t = flag;
if(result[k])
t += (result[k++] - '0');
if(temp[j])
t += (temp[j++] - '0');
if(t >= 10)
flag = t / 10;
else
flag = 0;
temp2[l++] = ('0' + t % 10);
}
temp2[l] = 0;
memcpy(result, temp2, (l + 1) * sizeof(char));
}
reverse(result, l);
free(temp);
free(temp2);
return result;
}
方法2:每位的數字
分別取兩個字串中的某位數字,直接將其結果存放在乘積的對應位置上,如12*34
,1*4
和2 * 3
都會存在第二位上,對他們求和,後邊再操作進位即可。
執行時間4ms,程式碼如下。
char* multiply(char* num1, char* num2) {
int* sum = (int*)calloc(220, sizeof(int));
if(num1 == NULL || num2 == NULL || num1[0] == '0' || num2[0] == '0') {
char* result = (char*)calloc(2, sizeof(char));
result[0] = '0';
return result;
}
int l1 = strlen(num1);
int l2 = strlen(num2);
int i = 0, j = 0, t = 0, index = 0;
for(i = 0; i < l1; i++) {
for(j = 0; j < l2; j++) {
sum[i + j] += (num1[i] - '0') * (num2[j] - '0');
}
}
for(i = l1 + l2 - 2; i >= 0; i--) {
sum[i] += t;
if(sum[i] >= 10) {
t = sum[i] / 10;
sum[i] = sum[i] % 10;
}
else
t = 0;
}
int len = 2 + (t ? l1 + l2 - 1 : l1 + l2 - 2);
char* result = (char*)malloc(len * sizeof(char));
if(t)
result[index++] = '0' + t;
for(i = 0; i <= l1 + l2 - 2; i++)
result[index++] = sum[i] + '0';
result[index] = 0;
free(sum);
return result;
}