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 }

 

posted on 2018-09-24 09:03  海岛Blog  阅读(427)  评论(0编辑  收藏  举报

导航