博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
51nod 1005: 大数加法(含符号)
阅读量:4217 次
发布时间:2019-05-26

本文共 2493 字,大约阅读时间需要 8 分钟。

基准时间限制:1 秒 空间限制:131072 KB 分值: 0
收藏
关注
给出2个大整数A,B,计算A+B的结果。
Input
第1行:大数A第2行:大数B(A,B的长度 <= 10000 需注意:A B有可能为负数)
Output
输出A + B
Input示例
68932147586468711654886
Output示例
537643802472

#include
using namespace std;string bigSub(const string a,const string b) { int lena = a.size(); int lenb = b.size(); int max_len = lena > lenb ? lena : lenb; vector
res; res.resize(max_len); int flag = 1;//默认a大于等于b if(lena < lenb || (lena == lenb && a < b)){ flag = 0;//b > a } if(flag){ // a >= b时候 for(int i = 0; i < lenb; ++i){ res[i] = a[lena-i-1]-b[lenb-i-1];//保存结果 } for(int i = lenb; i < lena; ++i){//a 的高位直接拿下来 res[i] = a[lena-i-1]-'0'; } } else{//如果a < b for(int i = 0; i < lena; ++i){ res[i] = b[lenb-i-1]-a[lena-i-1]; } for(int i = lena; i < lenb; ++i){//b的高位直接放下来 res[i] = b[lenb-i-1]-'0'; } } for(int i = 0; i < max_len; ++i){//对结果进行借位处理 if(res[i] < 0){ res[i] += 10; res[i+1] -= 1; } } string r = ""; if(!flag) //确定结果符号 r += "-"; int k; for(k = max_len-1; k >= 0; --k){ //过滤掉前缀 0 if(res[k] != 0) break; } if(k == -1){ //当两个数之差 为 0 时候 保存 0值 return r += '0';//差值为0 } for(; k >= 0; --k){//结果不为0时候记录结果 r += res[k]+'0'; } return r; } string bigAdd(const string a,const string b) { int lena = a.size(); int lenb = b.size(); int lensum = lena > lenb ? lena+1 : lenb+1; vector
res; res.resize(lensum); for(int i = 0,j = 0; i < lena && j < lenb; ++i,++j){ res[i] = a[lena-i-1]-'0' + b[lenb-i-1]-'0'; } if(lena > lenb){ for(int i = lenb; i < lena; ++i){ res[i] = a[lena-i-1]-'0'; } } else if(lenb > lena){ for(int i = lena; i < lenb; ++i){ res[i] = b[lenb-i-1]-'0'; } } for(int i = 0; i < lensum-1; ++i){ if(res[i] > 9){ int t = res[i]/10; res[i] = res[i]%10; res[i+1] += t; } } string r = ""; if(res[lensum-1]){//判断是否进位到最高位 r += res[lensum-1]+'0'; } for(int i = lensum-2; i >= 0; --i){//这里是lensum-2 r += res[i]+'0'; } return r; } string getSum(const string a,const string b) { string res; if(a[0] == b[0] && a[0] == '-'){//两个数都是负数 res = "-" + bigAdd(a.substr(1),b.substr(1)); } if(a[0] != '-' && b[0] != '-'){//都为正数 res = bigAdd(a,b); } if((a[0]=='-'&&b[0]!='-') || (a[0] != '-' && b[0] =='-')){//异号相加 转化为 减法运算 if(a[0] == '-'){ res = bigSub(b,a.substr(1)); } else{ res = bigSub(a,b.substr(1)); } } return res; } int main() { string a, b; cin >> a >> b; //cout << bigSub(a,b); cout << getSum(a,b); return 0; }

转载地址:http://hhimi.baihongyu.com/

你可能感兴趣的文章
android TextView属性大全(转)
查看>>
Conclusion for Resource Management
查看>>
Conclusion for Constructors,Destructors,and Assignment Operators
查看>>
Conclusion for Accustoming Yourself to C++
查看>>
面试题1:赋值运算函数(offer)
查看>>
Mark : MessagePack简介及使用
查看>>
Mark : hive文件存储格式
查看>>
mark : hadoop 四种压缩格式
查看>>
All Things OpenTSDB
查看>>
单例模式(singleton),工厂方法模式(factory),门面模式(facade)
查看>>
抽象模式,适配器模式(Adapter),模板方法模式(Template method)
查看>>
建造者模式(builder),桥梁模式(bridge mode),命令模式(Command mode)
查看>>
装饰模式(Decorator),迭代器模式(Iterator),组合模式(composite)
查看>>
观察者模式(Observer),责任链模式,访问者模式(Visitor)
查看>>
状态模式(State)
查看>>
快速排序
查看>>
插入算法
查看>>
希尔排序
查看>>
选择排序
查看>>
归并排序
查看>>