# Original: calc.c ```c #include #include #include int ctoi(char c) { int ret = -1; if (!(c < '0' || c > '9')) { ret = c - '0'; } return ret; } char itoc(int i) { char ret = '\0'; if (!(i < 0 || i > 9)) { ret = '0' + i; } return ret; } void add_buffers(char *bufA, char *bufB) { int bufLen = strlen(bufA); int carry = 0; int i = 0; for (i = 0; i < bufLen; i++) { int buf_idx = bufLen - i - 1; char ba = bufA[buf_idx]; char bb = bufB[buf_idx]; int a = ctoi(ba); int b = ctoi(bb); int sab = (a + b + carry); carry = sab / 10; int remainder = sab % 10; bufA[buf_idx] = itoc(remainder); } } char *multiply(char* a, int lenA, char *b, int lenB) { int bufSize = lenA + lenB; char *buf = calloc(bufSize+1, sizeof(char)); char *retBuf = calloc(bufSize+1, sizeof(char)); memset(retBuf, '0', bufSize); for (int i = 0; i < lenA; i++) { memset(buf, '0', bufSize); int carry = 0; int a_idx = lenA - i - 1; for (int j = 0; j < lenB; j++) { int buf_idx = bufSize - i - j - 1; int b_idx = lenB - j - 1; int intA = ctoi(a[a_idx]); int intB = ctoi(b[b_idx]); int prod = intA * intB + carry; int remainder = (prod % 10); carry = prod / 10; buf[buf_idx] = itoc(remainder); if (j+1==lenB && carry) { buf[buf_idx-1] = itoc(carry); } } add_buffers(retBuf, buf); } free(buf); return retBuf; } int main(int argc, char *argv[]) { char *s1 = argv[1]; char *s2 = argv[2]; int lenS1 = strlen(s1); int lenS2 = strlen(s2); //check incoming //printf("s2 [%d] = %s\n", lenS2, s2); //printf("s1 [%d] = %s\n", lenS1, s1); //test add_buffers function //char bufA[5] = {'0', '0', '6', '2', '\0'}; //char bufB[5] = {'0', '1', '0', '8', '\0'}; //add_buffers(bufA, bufB); //printf("%s\n", bufA); char *result = multiply(s1, lenS1, s2, lenS2); printf("%s * %s = %s\n", s1, s2, result); free(result); return 0; } ```