当前位置: 代码迷 >> 综合 >> Hust oj 2084(大数)
  详细解决方案

Hust oj 2084(大数)

热度:2   发布时间:2023-12-22 04:47:23.0
A+B
Time Limit: 1000 MS Memory Limit: 32768 K
Total Submit: 487(144 users) Total Accepted: 174(132 users) Rating: Special Judge: No
Description
给你两个二进制数,求这两个二进制数的和。
Input
有多组测试数据。
每组测试数据有两个,分别为两个二进制数,仅由0和1组成,数字可能有前导0,每个数的长度不超过1000,且长度至少为1。
处理到文件结束。
Output
对于每组测试数据,输出一行,为两个数的和。
请去掉结果的前导0。
Sample Input
00
00
11
11101
0101
1010
Sample Output
0
100000
1111
讲道理就是一个大数,不过是个二进制的大数,把十进制的大数模板改改就好了,然而有前导0。。。因为这个前导0我改模板改蒙逼了都,不过还是改过来了
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;const int maxn = 1005;
char a[maxn],b[maxn];
int c[maxn];int main()
{while(~scanf("%s",&a)){scanf("%s",&b);int len_a = strlen(a);int len_b = strlen(b);int temp = 0;int cnt = 0;if(len_a >= len_b){for(int i=len_b-1;i>=0;i--){c[cnt] = ((a[len_a - cnt - 1] - '0') + (b[i] - '0') + temp) % 2;temp = ((a[len_a - cnt - 1] - '0') + (b[i] - '0') + temp) / 2;cnt++;}for(int i=len_a-len_b-1;i>=0;i--){c[cnt] = ((a[i] - '0')+ temp) % 2;temp = ((a[i] - '0') + temp) / 2;cnt++;}}else{for(int i=len_a-1;i>=0;i--){c[cnt] = ((b[len_b - cnt - 1] - '0') + (a[i] - '0') + temp) % 2;temp = ((b[len_b - cnt - 1] - '0') + (a[i] - '0') + temp) / 2;cnt++;}for(int i=len_b-len_a-1;i>=0;i--){c[cnt] = ((b[i] - '0')+ temp) % 2;temp = ((b[i] - '0') + temp) / 2;cnt++;}}int flag = 0;if(!temp)for(int i=cnt-1;i>=0;i--){if(c[i])break;elseflag++;}int i;if(temp)i=cnt-1;elsei=cnt-1-flag;if(flag == max(len_a,len_b))printf("0");else{if(temp)printf("%d",temp);for(;i>=0;i--)printf("%d",c[i]);}printf("\n");}return 0;
}