大数加减法(面试准备)

来源:互联网 发布:惩罚男朋友的招数知乎 编辑:程序博客网 时间:2024/04/29 01:34

大数加减法,使用string类型来表示数字

//思路:

1):对于两个正数或者是负数相加,则直接相加

2):负数加上正数,则相当于正数减去负数

代码如下:

/**大整数的加减法*/#include <iostream>#include <string>using namespace std;int myminus=0;//0 表示没有负号,1表示有string bignumdel(string str1,string str2);string bignumAdd(string str1,string str2){int len1=str1.length();int len2=str2.length();if(len1==0)return str2;if(len2==0)return str1;if(str1[0]=='-' && str2[0]=='-'){myminus=1;str1.erase(0,1);str2.erase(0,1);return bignumAdd(str1,str2);}else if(str1[0]=='-' && str2[0]!='-'){str1.erase(0,1);return bignumdel(str2,str1);}else if(str1[0]!='-' && str2[0]=='-'){str2.erase(0,1);return bignumdel(str1,str2);}//addint maxlen=len1;string result;if(len1>len2){maxlen=len1;for(int i=0;i<(len1-len2);i++){str2='0'+str2;}}else if(len2>len1){maxlen=len2;for(int i=0;i<(len2-len1);i++){str1='0'+str1;}}int takeover=0;for(int i=maxlen-1;i>=0;i--){int tmp=(str1[i]-'0')+(str2[i]-'0')+takeover;takeover=0;if(tmp>=10){tmp=tmp%10;takeover=1;}char ch=('0'+tmp);result= ch +result;}if(takeover==1)result='1'+result;return result;}string bignumdel(string str1,string str2){int len1=str1.length();int len2=str2.length();if(len1>len2){for(int i=0;i<len1-len2;i++)str2='0'+str2;}else if(len2>len1){for(int i=0;i<len2-len1;i++)str1='0'+str1;myminus=1;return bignumdel(str2,str1);}else if(len1==len2){if(str1<str2){myminus=1;return bignumdel(str2,str1);}   }//delint takeover=0;string result;for(int i=len1-1;i>=0;i--){int tmp=(str1[i]-'0')-(str2[i]-'0')-takeover;if(tmp<0){tmp=(str1[i]-'0')-(str2[i]-'0')+10-takeover;takeover=1;}char ch='0'+tmp;result= ch +result;}return result;}int main(){string str1,str2;while(cin>>str1>>str2){string res=bignumAdd(str1,str2);if(myminus==1)printf("-");int len=res.length();int i=0;while((i++)<len)//除0前缀{if(res[0]=='0'){res.erase(0,1);}else break;}cout<<res<<endl;myminus=0;}return 0;}


0 0
原创粉丝点击