JSK-61 二进制加法【大数】
给定两个二进制数组成的字符串,计算他们的和。
他们的和依然是字符串。
例如:
a = "11"
b = "1"
返回"100".
注意:千万别想着将二进制转换成10进制,计算以后再转换成二进制。
那样,在大数的时候,肯定溢出哦~
格式:
第一行输入两个长度不超过100的二进制字符串,中间以空格间隔开。
接下来输出两个二进制数的和。
样例输入
1010 1011
样例输出
10101
问题链接:JSK-61 二进制加法
问题描述:(略)
问题分析:
大数加法问题,用数组模拟计算。
程序说明:(略)
参考链接:(略)
题记:想不到好方法则或暴力或模拟。
AC的C语言程序如下:
1 /* JSK-61 二进制加法 */ 2 3 #include <stdio.h> 4 #include <string.h> 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 } else 22 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 // 去掉高位的0 33 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 #include <stdio.h> 4 #include <string.h> 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 // 去掉高位的0 29 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 }