给定两个二进制数组成的字符串,计算他们的和。
他们的和依然是字符串。
例如:
a = "11"
b = "1"
返回"100".
注意:千万别想着将二进制转换成10进制,计算以后再转换成二进制。
那样,在大数的时候,肯定溢出哦~
格式:
第一行输入两个长度不超过100的二进制字符串,中间以空格间隔开。
接下来输出两个二进制数的和。
样例输入
1010 1011
样例输出
10101
问题链接:
问题描述:(略)
问题分析:
大数加法问题,用数组模拟计算。
程序说明:(略)
参考链接:(略)
题记:想不到好方法则或暴力或模拟。
AC的C语言程序如下:
1 /* JSK-61 二进制加法 */ 2 3 #include4 #include 5 6 #define N 100 7 char a[N + 1], b[N + 1], c[N + 2]; 8 9 int main()10 {11 while(~scanf("%s%s", a, b)) {12 int i = strlen(a) - 1, j = strlen(b) - 1, carry = 0, k = N;13 for(;;) {14 if(a[i] == '0' && b[j] == '0') {15 c[k] = (carry ? '1' : '0');16 carry = 0;17 } else if(a[i] == '1' && b[j] == '1') {18 c[k] = (carry ? '1' : '0');19 if(carry == 0)20 carry = 1;21 } else22 c[k] = (carry ? '0' : '1');23 24 25 k--; i--; j--;26 if(i < 0 && j < 0) break;27 if(i < 0) {i = 0; a[i] = '0';}28 if(j < 0) {j = 0; b[j] = '0';}29 }30 // 最后的进位处理31 c[k] = carry + '0';32 // 去掉高位的033 while(c[k] == '0' && k < N)34 k++;35 36 // 输出结果37 c[N + 1] = '\0';38 printf("%s\n", &c[k]);39 }40 41 return 0;42 }
WA的C语言程序如下:
1 /* JSK-61 二进制加法 */ 2 3 #include4 #include 5 6 #define BASE 2 7 #define N 100 8 char a[N + 1], b[N + 1], c[N + 2]; 9 10 int main(void)11 {12 // 读入2个数放入数组a[]和b[]13 while(~scanf("%s%s", a, b)) {14 int i = strlen(a) - 1, j = strlen(b) - 1, k = N;15 char carry = 0;16 // 2个数相加17 for(; ;) {18 char t = a[i--] - '0' + b[j--] - '0' + carry;19 carry = t / BASE;20 c[k--] = t % BASE + '0';21 22 if(i < 0 && j < 0) break;23 if(i < 0) {a[0] = '0'; i = 0;}24 if(j < 0) {a[0] = '0'; j = 0;}25 }26 // 最后的进位处理27 c[k] = carry + '0';28 // 去掉高位的029 while(c[k] == '0' && k < N)30 k++;31 32 // 输出结果33 c[N + 1] = '\0';34 printf("%s\n", &c[k]);35 }36 37 return 0;38 }