From df9f4a357bf4d83451154c1111ef1bda63a8006b Mon Sep 17 00:00:00 2001 From: begeekmyfriend Date: Mon, 21 Aug 2017 11:34:08 +0800 Subject: [PATCH] Multiply strings Signed-off-by: begeekmyfriend --- 043_multiply_strings/Makefile | 2 + 043_multiply_strings/multiply_strings.c | 67 +++++++++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 043_multiply_strings/Makefile create mode 100644 043_multiply_strings/multiply_strings.c diff --git a/043_multiply_strings/Makefile b/043_multiply_strings/Makefile new file mode 100644 index 0000000..b90103f --- /dev/null +++ b/043_multiply_strings/Makefile @@ -0,0 +1,2 @@ +all: + gcc -O2 -o test multiply_strings.c diff --git a/043_multiply_strings/multiply_strings.c b/043_multiply_strings/multiply_strings.c new file mode 100644 index 0000000..be32919 --- /dev/null +++ b/043_multiply_strings/multiply_strings.c @@ -0,0 +1,67 @@ +#include +#include +#include + +static void reverse(char *s, int len) +{ + int low = 0; + int high = len - 1; + while (low < high) { + char c = s[low]; + s[low] = s[high]; + s[high] = c; + low++; + high--; + } +} + +static char* multiply(char* num1, char* num2) { + if (*num1 == '\0') { + return num1; + } + if (*num2 == '\0') { + return num2; + } + + int i, j; + char *result = malloc(110 + 110); + memset(result, '0', 220); + int len1 = strlen(num1); + int len2 = strlen(num2); + reverse(num1, len1); + reverse(num2, len2); + for (i = 0; i < len1; i++) { + int carry = 0; + for (j = 0; j < len2; j++) { + carry += (num1[i] - '0') * (num2[j] - '0') + (result[i + j] - '0'); + result[i + j] = carry % 10 + '0'; + carry /= 10; + } + if (carry != 0) { + result[len2 + i] = carry + '0'; + } + } + int len = 220; + while (--len >= 0) { + if (result[len] > '0') { + result[++len] = '\0'; + break; + } + } + if (len == -1) { + len = 1; + result[len] = '\0'; + } + reverse(result, len); + return result; +} + +int main(int argc, char **argv) +{ + if (argc != 3) { + fprintf(stderr, "Usage: ./test m1 m2\n"); + exit(-1); + } + printf("%s\n", multiply(argv[1], argv[2])); + return 0; +}