二进制加法
给定两个二进制数组成的字符串,计算他们的和。
他们的和依然是字符串。
例如:
a = “11”
b = “1”
返回"100".
注意:千万别想着将二进制转换成10进制,计算以后再转换成二进制。
那样,在大数的时候,肯定溢出哦~
格式:
第一行输入两个长度不超过100的二进制字符串,中间以空格间隔开。
接下来输出两个二进制数的和。
样例输入
1010 1011
样例输出
10101
问题链接:JSK-61 二进制加法
问题描述:(略)
问题分析:
这个问题是大数加法问题。使用long long类型也无法表示的数通常成为大数,即大整数。
大整数计算通常用数组模拟计算。
需要注意的是,阿拉伯记数法中,高位在左边,低位在右边。加法运算是从右到左。把数存储在数组中,高位存储在下标小的元素里,低位存储在下标大的元素里。
程序说明:
需要注意,2个数的位数可能不相同,需要进行必要的处理。同时,2数相加有可能产生进位,需要考虑其存储单元。
这里给出2个程序,一个是用逻辑判断实现计算,另外一个则用算术运算实现。
参考链接:(略)
题记:想不到好方法则或暴力或模拟。
AC的C语言程序如下:
/* JSK-61 二进制加法 */
#include <stdio.h>
#include <string.h>
#define BASE 2
#define N 100
char a[N + 1], b[N + 1], c[N + 2];
int main(void)
{
// 读入2个数放入数组a[]和b[]
while(~scanf("%s%s", a, b)) {
int i = strlen(a) - 1, j = strlen(b) - 1, k = N;
char carry = 0;
// 2个数相加
for(; ;) {
char t = a[i--] - '0' + b[j--] - '0' + carry;
carry = t / BASE;
c[k--] = t % BASE + '0';
if(i < 0 && j < 0) break;
if(i < 0) {a[0] = '0'; i = 0;}
if(j < 0) {b[0] = '0'; j = 0;}
}
// 最后的进位处理
c[k] = carry + '0';
// 去掉高位的0
while(c[k] == '0' && k < N)
k++;
// 输出结果
c[N + 1] = '\0';
printf("%s\n", &c[k]);
}
return 0;
}
AC的C语言程序(逻辑判断)如下:
/* JSK-61 二进制加法 */
#include <stdio.h>
#include <string.h>
#define N 100
char a[N + 1], b[N + 1], c[N + 2];
int main()
{
while(~scanf("%s%s", a, b)) {
int i = strlen(a) - 1, j = strlen(b) - 1, carry = 0, k = N;
for(;;) {
if(a[i] == '0' && b[j] == '0') {
c[k] = (carry ? '1' : '0');
carry = 0;
} else if(a[i] == '1' && b[j] == '1') {
c[k] = (carry ? '1' : '0');
if(carry == 0)
carry = 1;
} else
c[k] = (carry ? '0' : '1');
k--; i--; j--;
if(i < 0 && j < 0) break;
if(i < 0) {i = 0; a[i] = '0';}
if(j < 0) {j = 0; b[j] = '0';}
}
// 最后的进位处理
c[k] = carry + '0';
// 去掉高位的0
while(c[k] == '0' && k < N)
k++;
// 输出结果
c[N + 1] = '\0';
printf("%s\n", &c[k]);
}
return 0;
}