首页 > 学院 > 开发设计 > 正文

大整数加减运算(包括正负)

2019-11-08 00:44:53
字体:
来源:转载
供稿:网友
#include"stdafx.h"#include<iostream>#include<cstdio>#include<string>#include<algorithm>using namespace std;const int maxn = 3000; //大整数位数struct BigNumber{ int len, s[maxn]; // 从0开始存个位 bool positive; //正号 T非负数(包括0) F负数 //构造函数 BigNumber() { memset(s, 0, sizeof(s)); len = 1; positive = true; } BigNumber(int num) { memset(s, 0, sizeof(s)); *this = num; } BigNumber(const char* num) { memset(s, 0, sizeof(s)); *this = num; } //取反 BigNumber(const BigNumber &b,bool negate = true) { len = b.len; positive = b.positive; if (!negate) positive = !b.positive; for (int i = 0; i < len; i++) { s[i] = b.s[i]; } } //字符串直等 BigNumber Operator = (const char* num) { len = strlen(num); if (num[0] == '-') //符号位不计入数组 positive = false; else positive = true; for (int i = 0; i < len; i++) s[i] = num[len - i - 1] - '0'; if (!positive) { len -= 1; s[len] = 0; } return *this; } //int直等 BigNumber operator = (int num) { char str[maxn]; sPRintf(str, "%d", num); *this = str; //直接用字符串直等 return *this; } //返回字符串形式 const表面x.str()不会改变x string str() const { string res = ""; for (int i = 0; i < len; i++) { res = (char)(s[i] + '0') + res; } if (res == "") res = "0"; else if (!positive) res = '-' + res; return res; } //重载 + 号 BigNumber operator + (const BigNumber &b) const { if (positive && !b.positive) { BigNumber c(b, false); return *this - c; } else if (!positive && b.positive) { BigNumber c(*this,false); return b- *this; } else { BigNumber c; c.len = 0; if (positive && b.positive) { c.positive = true; } else if (!positive && !b.positive) { c.positive = false; } for (int i = 0, g = 0; i < max(len, b.len) + 1; i++) { int x = s[i] + b.s[i] + g; c.s[c.len++] = x % 10; g = x / 10; } //检查前导0 int j = 0; for (j = c.len - 1; j >= 0; j--) if (c.s[j]) break; c.len = j + 1; return c; } } void Print() { if (positive) cout << "正数: "<<str()<<endl; else cout << "负数: "<<str()<<endl; } //重载 - 号 //作减法的时候我们稍微修改一下步骤,先判断没有符号的情况下哪个大,然后用大数-小数,最后加正负 BigNumber operator - (const BigNumber &b) const { if (!positive && !b.positive) //均为负数 { BigNumber a1(*this, false); BigNumber c(b, false); return c - a1; } else if (!positive && b.positive) //a负b正 { BigNumber a1(*this,false); BigNumber c; c = a1 + b; c.positive = false; return c; } else if (positive && !b.positive) //a正b负 { BigNumber c(b, false); return *this + c; } else //均为正数 { BigNumber c; c.len = 0; if (*this < b) { c = b - *this; c.positive = false; return c; } for (int i = 0, g = 0; i < max(len, b.len); i++) { int x = s[i] - b.s[i] - g; if (x < 0) g = 1; else g = 0; c.s[c.len++] = x + g * 10; } //检查前导0 int j = 0; for (j = c.len - 1; j >= 0; j--) if (c.s[j]) break; c.len = j + 1; return c; } } //重载 += BigNumber operator += (const BigNumber &b) { *this = *this + b; return *this; } bool operator < (const BigNumber &b) const { if (positive && !b.positive) return false; else if (!positive && b.positive) return true; if (positive && b.positive) { if (len != b.len) return len < b.len; for (int i = len - 1; i >= 0; i--) if (s[i] != b.s[i]) return s[i] < b.s[i]; } else { if (len != b.len) return len > b.len; for (int i = len - 1; i >= 0; i--) if (s[i] != b.s[i]) return s[i] > b.s[i]; } return false; } bool operator > (const BigNumber &b) const { return b < *this; } bool operator <= (const BigNumber &b) const { return !(b < *this); } bool operator >= (const BigNumber &b) const { return !(*this < b); } bool operator != (const BigNumber &b) const { return b < *this || *this < b; } bool operator == (const BigNumber &b) const { return !(*this != b); }};//重载cin和cout 其实也可以直接定义stringistream &operator >> (istream &in, BigNumber &x){ string s; in >> s; x = s.c_str(); return in;}ostream &operator << (ostream &out, const BigNumber &x){ out << x.str(); return out;}int main(){ BigNumber b1, b2; while (cin >> b1>>b2) { //BigNumber b1(s1.c_str()); //BigNumber b2(s2.c_str()); //b1.Print(); //b2.Print(); //cout << (b1 < b2) << endl; cout << (b1+b2).str() << endl; cout << (b1 - b2).str() << endl; }}
上一篇:工厂方法模式

下一篇:Listener监听器

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表