43. Multiply strings

#include <stdlib.h>
#include <string.h>

char *multiply(char *num1, char *num2) {
  int n = strlen(num1), m = strlen(num2);
  int *pos = calloc(n + m, sizeof(int));

  for (int i = n - 1; i >= 0; i--) {
    for (int j = m - 1; j >= 0; j--) {
      int mul = (num1[i] - '0') * (num2[j] - '0');
      int sum = mul + pos[i + j + 1];
      pos[i + j + 1] = sum % 10; // ones digit stays here
      pos[i + j] += sum / 10;    // carry goes one position left
    }
  }

  char *res = malloc(n + m + 1);
  int k = 0;
  for (int i = 0; i < n + m; i++)
    if (!(k == 0 && pos[i] == 0)) // skip leading zeros
      res[k++] = '0' + pos[i];
  if (k == 0)
    res[k++] = '0';
  res[k] = '\0';

  free(pos);
  return res;
}
#include <string>
#include <vector>

using namespace std;

class Solution {
public:
  string multiply(string num1, string num2) {
    int n = num1.size(), m = num2.size();
    vector<int> pos(n + m, 0);

    for (int i = n - 1; i >= 0; i--) {
      for (int j = m - 1; j >= 0; j--) {
        int mul = (num1[i] - '0') * (num2[j] - '0');
        int sum = mul + pos[i + j + 1];
        pos[i + j + 1] = sum % 10; // ones digit stays here
        pos[i + j] += sum / 10;    // carry goes one position left
      }
    }

    string res;
    for (int d : pos)
      if (!(res.empty() && d == 0)) // skip leading zeros
        res += char('0' + d);

    return res.empty() ? "0" : res;
  }
};
package mathgeometry

func multiply(num1 string, num2 string) string {
    n, m := len(num1), len(num2)
    pos := make([]int, n+m)

    for i := n - 1; i >= 0; i-- {
        for j := m - 1; j >= 0; j-- {
            mul := int(num1[i]-'0') * int(num2[j]-'0')
            sum := mul + pos[i+j+1]
            pos[i+j+1] = sum % 10 // ones digit stays here
            pos[i+j] += sum / 10  // carry goes one position left
        }
    }

    res := make([]byte, 0, n+m)
    for _, d := range pos {
        if !(len(res) == 0 && d == 0) { // skip leading zeros
            res = append(res, byte('0'+d))
        }
    }
    if len(res) == 0 {
        return "0"
    }
    return string(res)
}
class Solution {
    public String multiply(String num1, String num2) {
        int n = num1.length(), m = num2.length();
        int[] pos = new int[n + m];

        for (int i = n - 1; i >= 0; i--) {
            for (int j = m - 1; j >= 0; j--) {
                int mul = (num1.charAt(i) - '0') * (num2.charAt(j) - '0');
                int sum = mul + pos[i + j + 1];
                pos[i + j + 1] = sum % 10; // ones digit stays here
                pos[i + j] += sum / 10;    // carry goes one position left
            }
        }

        StringBuilder res = new StringBuilder();
        for (int d : pos)
            if (!(res.length() == 0 && d == 0)) // skip leading zeros
                res.append(d);

        return res.length() == 0 ? "0" : res.toString();
    }
}
/**
 * @param {string} num1
 * @param {string} num2
 * @return {string}
 */
var multiply = function (num1, num2) {
  const n = num1.length, m = num2.length;
  const pos = new Array(n + m).fill(0);

  for (let i = n - 1; i >= 0; i--) {
    for (let j = m - 1; j >= 0; j--) {
      const mul = (num1.charCodeAt(i) - 48) * (num2.charCodeAt(j) - 48);
      const sum = mul + pos[i + j + 1];
      pos[i + j + 1] = sum % 10; // ones digit stays here
      pos[i + j] += Math.floor(sum / 10); // carry goes one position left
    }
  }

  let res = "";
  for (const d of pos)
    if (!(res === "" && d === 0)) res += d; // skip leading zeros

  return res === "" ? "0" : res;
};
class Solution:
    def multiply(self, num1: str, num2: str) -> str:
        n, m = len(num1), len(num2)
        pos = [0] * (n + m)

        for i in range(n - 1, -1, -1):
            for j in range(m - 1, -1, -1):
                mul = int(num1[i]) * int(num2[j])
                total = mul + pos[i + j + 1]
                pos[i + j + 1] = total % 10  # ones digit stays here
                pos[i + j] += total // 10  # carry goes one position left

        res = "".join(map(str, pos)).lstrip("0")  # skip leading zeros
        return res or "0"
impl Solution {
    pub fn multiply(num1: String, num2: String) -> String {
        let (a, b) = (num1.as_bytes(), num2.as_bytes());
        let (n, m) = (a.len(), b.len());
        let mut pos = vec![0u32; n + m];

        for i in (0..n).rev() {
            for j in (0..m).rev() {
                let mul = (a[i] - b'0') as u32 * (b[j] - b'0') as u32;
                let sum = mul + pos[i + j + 1];
                pos[i + j + 1] = sum % 10; // ones digit stays here
                pos[i + j] += sum / 10; // carry goes one position left
            }
        }

        let res: String = pos
            .iter()
            .skip_while(|&&d| d == 0) // skip leading zeros
            .map(|&d| (b'0' + d as u8) as char)
            .collect();

        if res.is_empty() { "0".to_string() } else { res }
    }
}