1. 程式人生 > >LeetCode 43. 字串相乘 Multiply Strings(C語言)

LeetCode 43. 字串相乘 Multiply Strings(C語言)

題目描述:

給定兩個以字串形式表示的非負整數 num1 和 num2,返回 num1 和 num2 的乘積,它們的乘積也表示為字串形式。

示例 1:

輸入: num1 = “2”, num2 = “3”
輸出: “6”

示例 2:

輸入: num1 = “123”, num2 = “456”
輸出: “56088”

說明:

  1. num1 和 num2 的長度小於110。
  2. num1 和 num2 只包含數字 0-9。
  3. num1 和 num2 均不以零開頭,除非是數字 0 本身。
  4. 不能使用任何標準庫的大數型別(比如 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*341*42 * 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;
}