From a46ec300092c1ee8ccac629b7f335643f87662f5 Mon Sep 17 00:00:00 2001 From: Steve Lee Date: Sat, 13 Jan 2018 05:13:14 +0800 Subject: update --- Computer_Science/leetcode/67-add_binary.c | 75 +++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 Computer_Science/leetcode/67-add_binary.c (limited to 'Computer_Science/leetcode/67-add_binary.c') diff --git a/Computer_Science/leetcode/67-add_binary.c b/Computer_Science/leetcode/67-add_binary.c new file mode 100644 index 0000000..48e4744 --- /dev/null +++ b/Computer_Science/leetcode/67-add_binary.c @@ -0,0 +1,75 @@ +#define MAX(a, b) ((a) > (b) ? (a) : (b)) +char* addBinary(char* a, char* b) { + int lenA = strlen(a); + int lenB = strlen(b); + + int len = MAX(lenA, lenB) + 1; + char* result = malloc(sizeof(char) * (len + 1)); + result[len--] = '\0'; + char in = '0'; + int sum = 0; + + lenA--; + lenB--; + + if(len == 0) return "0"; + + while(lenA >= 0 && lenB >=0) { + sum = a[lenA] + b[lenB] + in - 3 * '0'; + switch(sum) { + case 0: + in = '0'; + result[len] = '0'; + break; + case 1: + in = '0'; + result[len] = '1'; + break; + case 2: + in = '1'; + result[len] = '0'; + break; + case 3: + in = '1'; + result[len] = '1'; + break; + } + lenA--; + lenB--; + len--; + } + + while(lenA >= 0) { + if(in == '0') { + result[len] = a[lenA]; + } else if(a[lenA] == '1') { + result[len] = '0'; + in = '1'; + } else { + result[len] = '1'; + in = '0'; + } + lenA--; + len--; + } + + while(lenB >= 0) { + if(in == '0') { + result[len] = b[lenB]; + } else if(b[lenB] == '1') { + result[len] = '0'; + in = '1'; + } else { + result[len] = '1'; + in = '0'; + } + lenB--; + len--; + } + + if(in == '0') + return result + 1; + + *result = '1'; + return result; +} -- cgit v1.2.3