加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

51Nod--1005 大数加法

发布时间:2020-12-14 03:09:01 所属栏目:大数据 来源:网络整理
导读:题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1005 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 给出2个大整数A,B,计算A+B的结果。 Input 第1行:大数A 第2行:大数B (A,B的长度 = 10000 需注意:A B有可能为负数) Output

题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1005

基准时间限制:1 秒 空间限制:131072 KB 分值: 0

给出2个大整数A,B,计算A+B的结果。
Input
第1行:大数A
第2行:大数B
(A,B的长度 <= 10000 需注意:A B有可能为负数)
Output
输出A + B
Input示例
68932147586
468711654886
Output示例
537643802472

其实就是模拟我们在草稿纸上进行加减运算的过程,关键点在代码中给出了注释,代码使用了一些面向对象的性质:

 #include <iostream> #include <string> #include <cmath> using namespace std; struct BigNumber { // 初始化,处理负数  void init() { if(this->str[0] == '-') { isPos = false; this->str.erase(this->str.begin(),this->str.begin()+1); } else { isPos = true; } length = str.length(); } // 两个大整数相加的函数  string &add(BigNumber &other) { // 在位数短的那一个数前面补零,使两者位数相等  int diff = abs(other.length - this->length); other.length > this->length ? this->str.insert(0,diff,'0') : other.str.insert(0,'0'); // 两个正数或者两负,两负,就是两正数相加,符号为负  if(this->isPos && other.isPos || !this->isPos && !other.isPos) { for(int i = str.length()-1; i >= 0; i--) { str[i] += other.str[i] - '0'; // 如果和大于字符 9,即为 10 以上,那么进位  if(str[i] > '9') { // 如果是左边第一位数,那么注意处理进位  if(i == 0) { str.insert(0,1,(str[i]-'0')/10+'0'); str[1] = '0' + (str[1]-'0')%10; } else { str[i-1] += (str[i]-'0')/10; str[i] = '0' + (str[i]-'0')%10; } str[i] = '0' + (str[i]-'0')%10; } } // 一正一负相加,即为两数绝对值相减,符号为绝对值大的那个  } else { // 找出两个中绝对值较大的那个,如果不是this->str,那么交换  for(int i = 0; i < str.length(); i++) { if(str[i] < other.str[i]) { this->str.swap(other.str); // 更新结果正负  this->isPos = other.isPos; break; } else if(str[i] > other.str[i]) { break; } } for(int i = str.length()-1; i >= 0; i--) { str[i] -= other.str[i] - '0'; // 不够减则向左边一位数借 1  if(str[i] < '0') { str[i] += 10; str[i-1]--; } } } // 清除结果前面多余的 0  int zeroNum; for(zeroNum = 0; zeroNum < str.length(); zeroNum++) { if(str[zeroNum] != '0') { break; } } str.erase(str.begin(),str.begin()+zeroNum); // 如果结果是负数,那么开头加负号  if(!this->isPos) { this->str.insert(0,'-'); } // 还需要注意的是如果本身答案就是 0 的情况  if(str.length() == 0) { str.append(1,'0'); } return str; } string str; int length; // 是否为正数  bool isPos; }; int main() { BigNumber a,b; cin >> a.str >> b.str; a.init(); b.init(); cout << a.add(b) << endl; return 0; }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读