#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 }
}
}