6.A+B (I)

目录

题目

思路

注意事项 

C++代码

题目

Description

学过《计算机科学导论》的你应该熟悉“二进制运算”吧?

和十进制不同的是:二进制运算“逢二进一”。下面举一个二进制加法的运算实例:

   11101
+    110
--------
  100011
下面请你模拟这个过程。

Input

第一行输入一个正整数 T 表示接下来有 T 组数据。
接下来 T 行,分别是两个待相加的二进制串a、b,长度小于10e5。

Output

对于每组数据,请按模拟二进制加法,按题目描述的格式输出正确的运算结果,注意换行,没有多余的空格和换行。

测试输入期待的输出时间限制内存限制额外进程
测试用例 1以文本方式显示
  1. 1↵
  2. 11101 110↵
以文本方式显示
  1.    11101↵
  2. +    110↵
  3. --------↵
  4.   100011↵
1秒64M0


思路

输入T,循环处理每个测试案例;

输入两个字符串str1、str2并反转,方便后续低位向高位的进位;

两个字符串对应位置相加,大于等于2的要进位,得到str;

将str1、str2、str反转并按照规定格式输出。


注意事项 

  1. 前面反转str1,str2时要先去掉前导0;后面反转str后再去掉前导0。
  2. 记录str1和str2的最大位数len,将str的位数设为len+1,因为str位数要么为len,要么为len+1。
  3. 使用int sum = (i < str1.length() ? str1[i] - '0' : 0) + (i < str2.length() ? str2[i] - '0' : 0)来计算每一位上的和;用str[i] += sum将和加到当前位置的字符上。
  4. 如果i位置的字符大于等于2,需要进位;
    i位置的字符减去2;
    i+1位字符加1
  5. 最终输出的字符串长度为结果字符串的长度+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;
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

榆榆欸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值