sicily1201 01000001
来源:互联网 发布:网络系统威胁 网络传输 编辑:程序博客网 时间:2024/06/05 01:10
题目链接:http://soj.sysu.edu.cn/1201
题目大意:输入两个二进制数,输出相加结果
解题思路:高精度相加
首先,在两个二进制数的前面都补若干个0,使它们的位数相等。注意:即使是长度相等,也要补上一个0,这个是用来存储最高位的进位的。比如:1001和10这两个数,补全后应该是01001,00010;而1100和1001则应该变为01100和01001。
然后,从二进制的最低位(即字符串的最高位)开始依次进行二进制数的相加,如果结果大于1(即10或11),则把最低位(即0或1)保存在答案数组里,然后把进位(即1)加到高位的被加数上。
最后,对存储答案的数组输出。注意要删除前面多余的0
本题需要特别注意的地方就是相加结果为0的时候。刚开始没考虑这个问题导致WA,然后我想到了要考虑0的情况,但是为了避免修改最后输出数组的代码,我只是简单地在最前面判断输入输入字符串是否为“0”的情况,结果又是WA。苦想不出结果后上网搜寻答案,结果发现输入有可能是“000”和“00”等类型的,我前面简单的判断是无法满足这种情况的,于是还是得修改最后的输出,多加一个判断输出0即可。哎,贪图简便不深入思考是不行的啊!
#include <iostream>#include <string>using namespace std;int main(){// n 表示测试数据总数// lengtha、lengthb 分别表示字符串 a、b 的长度// 字符串 tempa、tempb 表示输入的两个字符串// 字符串 a、b 分别表示字符串 tempa、tempb 前面补 0 后的字符串int n, lengtha, lengthb, k;string a, b, tempa, tempb, temp;cin >> n;for (int count = 1; count <= n; count++){int c[81] = {0};// 用于存储答案cin >> tempa >> tempb;cout << count << " ";/*// 不能这样写,因为输入有可能是 00 和 00if (tempa == "0" && tempb == "0"){cout << "0" << endl;continue;}*/// 保证第一个字符串比第二个字符串长if (tempa.size() < tempb.size()){temp = tempa;tempa = tempb;tempb = temp;}lengtha = tempa.size();lengthb = tempb.size();a = "";b = "";// 字符串 tempb 前面补 0 操作for (int i = 0, m = lengtha - lengthb + 1; i < m; i++)b += '0';b += tempb;// 获得补 0 后的字符串 tempba += '0' + tempa;// 获得补 0 后的字符串 tempa// 进行二进制相加for (int i = lengtha; i > 0; i--){c[i] = (a[i] - '0') + (b[i] - '0');// 如果两个数相加产生进位,则 c[i] 保存最低位,并把进位加到前一位被加数中if (c[i] > 1){c[i] -= 2;a[i - 1] += 1;}}c[0] = a[0] - '0';// 保存最高位的进位// 输出结果,删除前面多余的 0for (k = 0; k <= lengtha; k++)if (c[k] != 0){for (int j = k; j <= lengtha; j++)cout << c[j];break;}// 如果 a 和 b 相加为 0, c 数组中存储的数全为 0// 上述循环不会输出,循环结束后 k == lengtha + 1// 因此要在这里输出 0,否则不会产生输出而导致 WAif (k == lengtha + 1)cout << "0";cout << endl;}return 0;}
0 0
- sicily1201 01000001
- Sicily1201——01000001
- 1201. 01000001
- 1201. 01000001
- 1201. 01000001
- poj2845 01000001
- fjnu 1382 01000001
- sicily 1201 01000001
- poj 2845 01000001
- Sicily 1201. 01000001
- sicily--1201. 01000001
- POJ 2845 01000001
- Sicily 1201. 01000001
- sicily 1201. 01000001
- POJ 2845 01000001 可能会
- Sicily 1201 01000001(高精度运算)
- 1201. 01000001(纯粹加法操作 )
- POJ 2845 01000001(高精度)
- ScrollView嵌套ExpandableListView显示不正常的问题
- 二叉树层序前序中序后序遍历,深度
- 关于String s = new String("xyz")创建几个对象
- IT知识的重要性
- 关于使用httpclient类库写的爬虫抓取网页时返回403错误
- sicily1201 01000001
- 八皇后问题
- struts2的json-default和struts-default的区别
- opengl中glblendfunc用法
- IndentationError:expected an indented block错误解读
- Codeforces Round #274 (Div. 2) C. Exams
- addPosition方法的源码
- 互联网是一个很好的工具
- ZOJ 3380 Patchouli's Spell Cards (概率dp)