问题描述
输入
第一行输入一个正整数 T
(
1
≤
T
≤
10
)
(1 \leq T \leq 10)
(1≤T≤10),表示接下来有 T 组数据;
接下来 T 行,每行输入两个二进制串
a
a
a 和
b
b
b 中间用空格隔开,保证它们长度
1
≤
∣
a
∣
,
∣
b
∣
≤
1
0
5
1 \leq |a|, |b| \leq 10 ^ 5
1≤∣a∣,∣b∣≤105 并且没有前导 0。
输出
对于每组数据,请按模拟二进制加法,按题目描述的格式输出正确的运算结果,注意换行,没有多余的空格和换行。
测试数据
代码
说白了这个二进制加法的题,就是二进制加法嘛。。。
大一上C语言的课应该都做过这道题。。
具体的我就不说了
我本人算法实在不是很行,这是我小学期里做出来的第一道题了。。
虽然这只是我自己闲来无事把代码传上来,但是要真有学弟学妹看到了这段代码的话,emmmmmm,小学期所有的代码我都会上传,实在想不出来可以当个参考,不过最好还是先自己想
#include<stdio.h>
#include<string.h> //这是第二题 二级制加法
int main()
{
int N; //这道题的整体思路可以参考之前做过的十进制加减法
scanf("%d",&N);
for (int n=1;n<=N;n++)
{
char str[100001];
int a[100001] = {0}, b[100001] = {0}, c[100001] = {0}, lenc, lena, lenb, i, j;
//首先将两个加数转化为int类型,再倒序录入两个存储数组
scanf("%s",str);
lena=strlen(str);
// 简单来说就是A和B分别存两个加数
// C来存结果,但是也可以直接把一个加数(A)也存在C里
// 然后做C = C + B, 这样C里面就是最后的结果
// A就不动了,保存到最后用来输出
for(i=0;i<lena;i++)
{
a[i]=str[lena-1-i]-'0';
c[i]=str[lena-1-i]-'0';
}
scanf("%s",str);
lenb=strlen(str);
for(i=0;i<lenb;i++)
{
b[i]=str[lenb-1-i]-'0';
}
lenc=(lena>lenb)?lena:lenb;
for(i=0;i<lenc;i++) //在这里做高精度额的二进制加减法,只需要将十进制加减法中的10都换成2即可
// c[i + 1]这一行就是判断需不需要加一个进位的1
// c[i] 就是计算相加再判断进位后剩下的结果
// 举个例子来说吧 如果是1234 + 5678
// a[0] = c[0] = 4, a[1] = c[1] = 3
// b[0] = 8, b[1] = 7
// 在第一次循环, i = 0, c[1] = (8 + 4) / 10 <- 这是进位的部分 + c[1] = 4
// c[0] = (8 + 4) % 10 = 2
// 在第二次循环, i = 1, c[2] = (7 + 4) / 10 + c[2] = 3
// c[1] = (7 + 4) % 10 = 1
{
c[i+1] += j = (c[i] + b[i]) / 2;
c[i] = (c[i] + b[i]) % 2;
}
if(j) lenc++; //判断是否需要进位
//开始输出
for(int x=1;x<=lenc+2-lena;x++)
{
printf(" ");
}
for(;lena > 0;lena --)
{
printf("%d",a[lena - 1]);
}
printf("\n");
printf("+");
for(int x = 1;x < lenc + 2 - lenb; x ++)
{
printf(" ");
}
for(; lenb > 0; lenb --)
{
printf("%d",b[lenb - 1]);
}
printf("\n");
for(int x = 1;x <= lenc + 2; x ++)
{
printf("-");
}
printf("\n");
printf(" ");
for(i = 0; i < lenc; i ++)
{
printf("%d",c[lenc - 1 - i]);
}
printf("\n");
}
return 0;
}