#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
//将s1置为较大数
bool exchangeS(string &s1,string &s2,int &size1,int &size2){
bool isExchange = false;
if(size1 < size2){
isExchange = true;
}else if(size1 == size2){
for(int i = 0;i != size1;i++){
if(s1[i] < s2[i]){
isExchange = true;
break;
}
}
}
if(isExchange){
swap(size1,size2);
swap(s1,s2);
}
return isExchange;
}
//大整数加法
string bigIntAdd(string &s1,string &s2){
int size1 = s1.size();
int size2 = s2.size();
bool isExchange = exchangeS(s1,s2,size1,size2);
bool isCarry = false;
for(int i = 0;i != size1;i++){
int addRes = s1[size1 - i - 1] - '0';
if(i < size2){
addRes += s2[size2 - i - 1] - '0';
}else if(!isCarry){
break;
}
if(isCarry)
addRes++;
isCarry = addRes >= 10;
addRes %= 10;
s1[size1 - i - 1] = '0' + addRes;
}
if(isCarry){
s1 = "1" + s1;
}
return s1;
}
//大整数减法
string bigIntSub(string s1,string s2){
//s1为正,s2为负
//s1为负,s2为正
//采用大整数加法。
bool isNegative1 = s1[0] == '-';
bool isNegative2 = s2[0] == '-';
if(isNegative1 && !isNegative2){
s1.erase(s1.begin());
bigIntAdd(s1,s2);
return "-" + s1;
}else if(isNegative2 && !isNegative1){
s2.erase(s2.begin());
bigIntAdd(s1,s2);
return s1;
}
if(isNegative1 && isNegative2){
s1.erase(s1.begin());
s2.erase(s2.begin());
}
int size1 = s1.size();
int size2 = s2.size();
bool isExchange = exchangeS(s1,s2,size1,size2);
bool isBorrow = false;
for(int i = 0;i != size1;i++){
char ch1 = s1[size1 - i - 1];
if(i < size2){
char ch2 = s2[size2 - i - 1];
isBorrow = ch1 < ch2;
int v = ch1 - ch2;
if(isBorrow)
v += 10;
s1[size1 - i - 1] = '0' + v;
}else if(!isBorrow)
break;
else{
if(isBorrow && s1[size1 - i - 1] > '0'){
s1[size1 - i - 1] -= 1;
if((size1 - i - 1) == 0 && s1[size1 - i - 1] == '0'){
s1.erase(s1.begin());
}
break;
}else{
s1[size1 - i - 1] = '9';
}
}
}
if(isNegative1 && isNegative2)
isExchange = !isExchange;
if(isExchange)
return "-" + s1;
return s1;
}
int main()
{
cout << bigIntSub("1111","222222") << endl;
cout << bigIntSub("-1111","222222") << endl;
cout << bigIntSub("-1111","-222222") << endl;
cout << bigIntSub("1111","-222222") << endl;
cout << "Hello World";
return 0;
}
C++大整数减法
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 题目:实现整数的减法,乘法和除法,只允许使用加法. 减法 减法是加法的另外一种形式,减法通过取反可以变成加法. ...
- 昨天项目上线,出现一个莫名奇妙的错误,缓存中计算库存所剩余数量,拿全部库存-已用库存,这里设置的库存为uint32...
- 2018.2.3 目标:身心健康,财富丰盛 好种子: 1早起健康早餐,种下健康的种子,回向群里姐妹及家人身心健康 ...