C++ string 实现大整数相加减

来源:互联网 发布:iis配置php 编辑:程序博客网 时间:2024/04/27 21:38

任意两个大整数的加减算法,可自动判断正负号,代码如下:

#include <iostream>#include <vector>#include <cstring>#include <algorithm>#include <string>using namespace std;string BigInegerAdd(string s1, string s2) // s1+s2;{int len = s1.size()>s2.size()?s1.size()+1:s2.size()+1;string res(len, '0');int i = s1.size() - 1, j = s2.size() - 1, k = len - 1;int borrow = 0;while(i >=0 && j >= 0){int sum = s1[i] - '0' + s2[j] - '0' + borrow;if (sum >= 10){borrow = 1;sum -= 10;res[k--] = sum + '0';}else {res[k--] = sum + '0'; borrow = 0;}i--;j--;}while(i >= 0){int sum = s1[i] - '0' + borrow;if (sum >= 10){borrow = 1;sum -= 10;res[k--] = sum + '0';}else {res[k--] = sum + '0'; borrow = 0;}i--;}while(j >= 0){int sum = s2[j] - '0' + borrow;if (sum >= 10){borrow = 1;sum -= 10;res[k--] = sum + '0';}else {res[k--] = sum + '0'; borrow = 0;}j--;}if (borrow == 1){res[k] = '1';}else res[k] = '0';if (res[0] == '0')//ignore the prefix '0's{return res.substr(1, res.size()-1);}else return res;}//negative == true means s1 < s2string BigInegerMinus(string s1, string s2, bool negative) // s1-s2; {if (s1.size() < s2.size()){return BigInegerMinus(s2, s1, true);}if (s1.size() == s2.size()){int i = 0;while(i < s1.size() && s1[i] == s2[i])i++;if (s1[i] < s2[i]){return BigInegerMinus(s2, s1, true);}}string res(s1.size(), '0');int i = s1.size() -1, j = s2.size() - 1;int k = i;int borrow = 0;while(i >= 0 && j >= 0){int sum = s1[i] - '0' - borrow - (s2[j] - '0');//cout<<sum<<endl;if (sum < 0){borrow = 1;sum += 10;res[k--] = sum + '0';}else{borrow = 0;res[k--] = sum + '0';}i--;j--;}while(i >= 0){int sum = s1[i--] - '0' - borrow;if (sum < 0){borrow = 1;sum += 10;res[k--] = sum + '0';}else{borrow = 0;res[k--] = sum + '0';}}if (res[0] == '0'){//ignore the prefix '0'sint index = 1;while(index < res.size() && res[index] == '0')index++;if (negative){return "-" + res.substr(index, res.size() - index);}else return res.substr(index, res.size() - index);}else {if (negative){return "-" + res;}else return res;}}string BigIneger(string s1, string s2){if (s1 == ""){return s2;}if (s2 == ""){return s1;}char sign1 = '+', sign2 = '+';if (s1[0] == '-'){ sign1 = '-';}if (s2[0] == '-'){sign2 = '-';}if (sign1 == '+' && sign2 == '+'){return BigInegerAdd(s1, s2);}else if (sign1 == '+' && sign2 == '-'){return BigInegerMinus(s1, s2.substr(1, s2.size()-1),false);}else if (sign1 == '-' && sign2 == '+'){return BigInegerMinus(s2, s1.substr(1, s1.size()-1), false);}else {string tmp = BigInegerAdd(s1.substr(1, s1.size()-1), s2.substr(1, s2.size()-1));if (tmp[0] == '0'){tmp = tmp.substr(1, tmp.size()- 1);}string res = "-" + tmp;return res;}}int main(){string s1 = "-789546321", s2 = "-15462897444";cout<<BigIneger(s1,s2)<<endl;return 0;}


0 0
原创粉丝点击