leetcode 67. 二进制求和(C语言)
生活随笔
收集整理的這篇文章主要介紹了
leetcode 67. 二进制求和(C语言)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目
給定兩個二進制字符串,返回他們的和(用二進制表示)。
輸入為非空字符串且只包含數字 1 和 0。
示例 1:
輸入: a = "11", b = "1" 輸出: "100"示例 2:
輸入: a = "1010", b = "1011" 輸出: "10101"有人提供思路說轉成int型再進行運算,但int無法處理超大數據
以下代碼純字符串指針操作:
代碼
執行用時: 4 ms, 在Add Binary的C提交中擊敗了57.09% 的用戶
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> char* addBinary(char* a, char* b) {char *c = NULL;//字符串指針,malloc內存int size_a = strlen(a);int size_b = strlen(b);int size_max = size_a > size_b ? size_a : size_b;int size_min = size_a < size_b ? size_a : size_b;int i;int j;char *a_ptr;char *b_ptr;char *c_ptr;int flag=0;//flag用來標記進位c = (char *)malloc(sizeof(char) * size_max + 2*sizeof(char));//動態內存*(c + size_max) = 0;//給c的最后兩個字節賦結束符\0(一個用來接讓字符串邊長的進位,一個用來存放結束符)*(c + size_max+1) = 0;a_ptr = a + size_a - 1;//a_ptr指向a最后一個元素b_ptr = b + size_b - 1;//b_ptr指向b最后一個元素c_ptr = c + size_max - 1;//c_ptr指向c最后一個元素printf("*a_ptr=%c\n", *a_ptr);printf("*b_ptr=%c\n", *b_ptr);//對齊輸出if (size_a < size_b){for (i = 0; i < abs(size_a - size_b); i++){printf(" ");}puts(a);puts(b);}else{puts(a);for (i = 0; i < abs(size_a - size_b); i++){printf(" ");}puts(b);}//復制較長字符串,便于讓差值保持原狀if (size_a > size_b){for (i = 0; i < size_a; i++){*(c + i) = *(a + i);}}else{for (i = 0; i < size_b; i++){*(c + i) = *(b + i);}} //相加for (i = 0; i < size_min; i++){*c_ptr = *a_ptr + *b_ptr;a_ptr--;b_ptr--;c_ptr--;}c_ptr = c + size_max - 1;//指針歸位//去掉字符導致的ascii重復運算for (i = 0; i < size_min; i++){*c_ptr = *c_ptr -48;c_ptr--;}c_ptr = c + size_max - 1;//指針歸位//進位flag = 0;//注意flag是intfor (i = 0; i < size_max; i++){*c_ptr = *c_ptr + flag;if (*c_ptr == '3'){flag = 1;*c_ptr = '1';c_ptr--;}else if (*c_ptr == '2'){flag = 1;*c_ptr = '0';c_ptr--;}else if (*c_ptr == '1'){flag = 0;*c_ptr = '1';c_ptr--;}else if (*c_ptr == '0'){flag = 0;*c_ptr = '0';c_ptr--;}}//如果循環結束后flag=1,說明還有進位,應在最前面添加1if (flag == 1){c_ptr = c + size_max;//指針指向最后一個字節for (i = 0; i < size_max; i++){*c_ptr = *(c_ptr - 1);//后移一位c_ptr--;}*(c_ptr + 0) = '1';}return c; } int main() {char *c;c=addBinary("1010", "1011");printf("結果:\n");puts(c);system("pause"); }總結
以上是生活随笔為你收集整理的leetcode 67. 二进制求和(C语言)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode 66. 加一(C语言)
- 下一篇: C语言 2048小游戏