本文共 2493 字,大约阅读时间需要 8 分钟。
第1行:大数A第2行:大数B(A,B的长度 <= 10000 需注意:A B有可能为负数)
输出A + B
68932147586468711654886
537643802472
#includeusing 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/