大数加法和大数减法
来源:互联网 发布:数据统计模型 编辑:程序博客网 时间:2024/04/28 05:15
两个极大的数相加或相减。主要运用字符串进行计算。
#include<iostream>#include<string>using namespace std;void reverse(string& input){ int n=input.size(); int i=0,j=n-1; while(i<j){ swap(input[i++],input[j--]); } return;}string myplus(string a,string b){ int alen=a.size(),blen=b.size(); reverse(a); reverse(b); int up=0; int i=0,j=0; string res; while(i<alen&&j<blen){ int aa=a[i]-'0',bb=b[j]-'0'; res.push_back(char((aa+bb+up)%10+'0')); up=(aa+bb+up)/10; i++; j++; } while(i<alen){ int aa=a[i]-'0'; res.push_back(char((aa+up)%10+'0')); up=(aa+up)/10; i++; } while(j<blen){ int bb=b[j]-'0'; res.push_back(char((bb+up)%10+'0')); up=(bb+up)/10; j++; } if(up) res.push_back(char(up+'0')); reverse(res); int ii=0; while(ii<res.size()&&res[ii]=='0') ii++; return ii==res.size()?"0":res.substr(ii);}string mysub(string a,string b){ string res; if(a[0]=='-'){ string tmp=b; b=a; a=tmp; } int alen=a.size(),blen=b.size(); int flag=0; if(alen<blen-1){ reverse(a); reverse(b); string tmp=b; b=a+"-"; a=tmp.substr(0,tmp.size()-1); alen=a.size(); blen=b.size(); flag=1; }else if(alen==blen-1){ int i=0,j=1; int fflag=0; while(i<alen&&j<blen){ while(a[i]==b[j]) {i++;j++;} if(a[i]<b[j]){ fflag=1; break; }else{ break; } } if(fflag){ reverse(a); reverse(b); string tmp=b; b=a+"-"; a=tmp.substr(0,tmp.size()-1); alen=a.size(); blen=b.size(); flag=1; }else{ reverse(a); reverse(b); } } else{ reverse(a); reverse(b); } int i=0,j=0; int borrow=0; while(i<alen&&b[j]!='-'){ if(borrow==0){ int aa=a[i]-'0',bb=b[j]-'0'; if(aa>=bb){ res.push_back(char(aa-bb+'0')); }else{ borrow=1; res.push_back(char(aa+10-bb+'0')); } }else{ int aa=a[i]-'0',bb=b[j]-'0'; if(aa-1>= bb){ borrow=0; res.push_back(char(aa-1-bb+'0')); }else{ res.push_back(char(aa-1+10-bb+'0')); } } i++;j++; } while(i<alen){ if(borrow==0){ res.push_back(a[i]); }else{ int aa=a[i]-'0'; if(aa-1>=0){ borrow=0; res.push_back(char(aa-1+'0')); }else{ res.push_back(char(aa-1+10+'0')); } } i++; } if(flag==1){ reverse(res); int ii=0; while(ii<res.size()&&res[ii]=='0') ii++; return ii==res.size()?"0":"-"+res.substr(ii); } else{ reverse(res); int ii=0; while(ii<res.size()&&res[ii]=='0') ii++; return ii==res.size()?"0":res.substr(ii); }}int main(){ string input1,input2; cin>>input1>>input2; if(input1[0]!='-'&&input2[0]!='-') cout<<myplus(input1,input2); else if(input1[0]=='-'&&input2[0]=='-') cout<<'-'<<myplus(input1.substr(1),input2.substr(1)); else{ cout<<mysub(input1,input2); }}
0 0
- 大数加法和大数减法
- 大数加法和减法
- 大数加法、减法和乘法
- 大数减法、加法、乘法
- 大数加法与减法
- 大数加法、减法、乘法
- 大数加法(减法) C++
- 大数运算的加法和减法
- 大数加法、大数乘法、大数减法。Swift。
- 大数乘法,大数加法,大数减法
- 大数加法 以及 大数减法的思路
- 大数加法.减法.乘法.除法
- 大数加法,减法,乘法总结
- 大数的加法,减法,乘法
- 使用C++类实现大数加法,大数减法,大数乘法
- 大数模板 大数加法,大数减法,大数乘法,大数除法,大数比较等操作
- 大数加法和大数乘法
- 大数加法和大数乘法
- XMPP 发送消息,发送图片
- JDK 源码解析 —— ConcurrentHashMap
- 图解django 中间件
- LeetCode -- Add Two Numbers
- LeetCode – Combination Sum
- 大数加法和大数减法
- LeetCode -- Contains Duplicate
- LeetCode -- Happy Number
- CSDN周排行第一
- 数据结构 一元多项式的创建、显示、相加、相减、相乘
- LeetCode -- Insertion Sort List
- LeetCode -- Letter Combinations of a Phone Number
- 仅供自己记录
- LeetCode -- Path Sum