void Add(char str1[], char str2[], int offset) {
int carry = 0;
int len2 = strlen(str2);
int i;
for (i = 0; i < len2; i++) {
int digit1 = TO_INT(str1[i + offset]);
int digit2 = TO_INT(str2[i]);
int result = digit1 + digit2 + carry;
str1[i + offset] = TO_CHAR(result % 10);
carry = result / 10;
}
while (carry != 0) {
int digit = TO_INT(str1[i]);
int result = digit + carry;
str1[i + offset] = TO_CHAR(result % 10);
carry = result / 10;
}
}
char *Multiply(char str1[], char str2[]) {
int len1 = strlen(str1);
int len2 = strlen(str2);
int product_len = len1 + len2;
char *product = new char[product_len + 1];
for (int i = 0; i < product_len; i++)
product[i] = '0';
product[product_len] = '\0';
int partial_len = len1 + 1;
char partial[partial_len + 1];
for (int i = 0; i < partial_len; i++)
partial[i] = '0';
partial[partial_len] = '\0';
for (int i = 0; i < len2; i++) {
int digit2 = TO_INT(str2[i]);
int carry = 0;
int j;
for (j = 0; j < len1; j++) {
int digit1 = TO_INT(str1[j]);
int result = digit1 * digit2 + carry;
partial[j] = TO_CHAR(result % 10);
carry = result / 10;
}
partial[j] = TO_CHAR(carry);
Add(product, partial, i);
}
return product;
}