JSK-61 二进制加法【大数】

二进制加法
给定两个二进制数组成的字符串,计算他们的和。
他们的和依然是字符串。
例如:
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;
}

猜你喜欢

转载自blog.csdn.net/tigerisland45/article/details/83064270
今日推荐