目录
题目
Description
学过《计算机科学导论》的你应该熟悉“二进制运算”吧?
和十进制不同的是:二进制运算“逢二进一”。下面举一个二进制加法的运算实例:
11101
+ 110
--------
100011
下面请你模拟这个过程。
Input
第一行输入一个正整数 T 表示接下来有 T 组数据。
接下来 T 行,分别是两个待相加的二进制串a、b,长度小于10e5。
Output
对于每组数据,请按模拟二进制加法,按题目描述的格式输出正确的运算结果,注意换行,没有多余的空格和换行。
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
思路
输入T,循环处理每个测试案例;
输入两个字符串str1、str2并反转,方便后续低位向高位的进位;
两个字符串对应位置相加,大于等于2的要进位,得到str;
将str1、str2、str反转并按照规定格式输出。
注意事项
- 前面反转str1,str2时要先去掉前导0;后面反转str后再去掉前导0。
- 记录str1和str2的最大位数len,将str的位数设为len+1,因为str位数要么为len,要么为len+1。
- 使用int sum = (i < str1.length() ? str1[i] - '0' : 0) + (i < str2.length() ? str2[i] - '0' : 0)来计算每一位上的和;用str[i] += sum将和加到当前位置的字符上。
- 如果i位置的字符大于等于2,需要进位;
i位置的字符减去2;
i+1位字符加1 - 最终输出的字符串长度为结果字符串的长度+2,需据此来调整空格数量以实现缩进。
C++代码
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int t;
cin >> t;// 输入测试案例的数量
while (t--) {// 循环处理每个测试案例
string str1, str2;
cin >> str1 >> str2;// 输入两个字符串
// 去掉字符串开头的0(如果有的话)
while (str1.size() > 1 && str1[0] == '0') {
str1.erase(0, 1);
}
while (str2.size() > 1 && str2[0] == '0') {
str2.erase(0, 1);
}
// 反转字符串
reverse(str1.begin(), str1.end());
reverse(str2.begin(), str2.end());
// 计算两个字符串的最大长度
long long len = max(str1.size(), str2.size());
string str(len + 1, '0');// 创建一个新的字符串,长度为最大长度+1,初始值为0
for (long long i = 0; i < len; i++) {
int sum = (i < str1.length() ? str1[i] - '0' : 0) + (i < str2.length() ? str2[i] - '0' : 0);
str[i] += sum;// 将和加到当前位置的字符上
if (str[i] >= '2') {// 如果当前位置的字符大于等于2,需要进位
str[i] -= 2;// 当前位置的字符减去2
str[i + 1]++;// 下一位字符加1
}
}
// 恢复原来的字符串顺序
reverse(str1.begin(), str1.end());
reverse(str2.begin(), str2.end());
reverse(str.begin(), str.end());
// 去掉字符串开头的0(如果有的话)
while (str.size() > 1 && str[0] == '0') {
str.erase(0, 1);
}
// 最终输出的字符串长度
long long finalLength = str.length() + 2;
for (long long i = str1.length(); i < finalLength; i++) {
cout << ' ';// 输出空格,对齐数字
}
cout << str1 << endl;// 输出第一个字符串
cout << '+';// 输出加号
for (long long i = str2.length() + 1; i < finalLength; i++) {
cout << ' ';// 输出空格,对齐数字
}
cout << str2 << endl;// 输出第二个字符串
for (long long i = 0; i < finalLength; i++) {
cout << '-';// 输出横线
}
cout << endl;
for (long long i = str.length(); i < finalLength; i++) {
cout << ' ';// 输出空格,对齐数字
}
cout << str << endl;// 输出计算结果
}
return 0;
}