bigNum(大整数)
来源:互联网 发布:下载mt4交易软件 编辑:程序博客网 时间:2024/06/05 08:31
其实这篇博客挺没有营养的,大整数算一个正式的算法么?不算吧,只是模拟了手动计算的过程而已。其中需要的注意的就是进制问题和进位问题。
下面的代码甚是丑陋,还请各位不吝赐教!
#include <iostream>#include <vector>using namespace std;class bigNum{public: vector<int> vec; bigNum(); bigNum(string str); bigNum(int num); string toString() const; bigNum operator + (const bigNum &a) const; bigNum operator * (const bigNum &a) const; bool operator == (const bigNum &a) const; friend istream& operator >> (istream &in, bigNum &a); friend ostream& operator << (ostream &out, bigNum &a);};bigNum::bigNum() { vec.push_back(0);}bigNum::bigNum(string str) { for (int i = str.size(); i >= 0; i -= 4) { int t = 0; for (int j = max(i - 4, 0); j < i; ++j) { t = t * 10 + str[j] - '0'; } vec.push_back(t); }}bigNum::bigNum(int num) { while (num) { vec.push_back(num % 10000); num /= 10000; }}bigNum bigNum::operator + (const bigNum &a) const { bigNum b; b.vec.clear(); int t = 0; for (int i = 0, j = 0; i < this->vec.size() || j < a.vec.size(); ++i, ++j) { if (i < this->vec.size() && j < a.vec.size()) t += this->vec[i] + a.vec[j]; else if (i >= this->vec.size()) t += a.vec[j]; else t += this->vec[i]; b.vec.push_back(t % 10000); t /= 10000; } if (t) b.vec.push_back(t); return b;}bigNum bigNum::operator * (const bigNum &a) const { bigNum b; for (int i = 0; i < this->vec.size(); ++i) { for (int j = 0; j < a.vec.size(); ++j) { if (i + j >= b.vec.size()) b.vec.push_back(this->vec[i] * a.vec[j]); else b.vec[i + j] += this->vec[i] * a.vec[j]; } int t = 0; for (int j = 0; j < b.vec.size(); ++j) { if (b.vec[j] / 10000 && j + 1 != b.vec.size()) b.vec[j + 1] += b.vec[j] / 10000; else if (b.vec[j] / 10000) b.vec.push_back(b.vec[j] / 10000); b.vec[j] %= 10000; } } while (b.vec.size() > 1 && b.vec[b.vec.size() - 1] == 0) b.vec.pop_back(); return b;}string bigNum::toString() const { string ans; for (int i = vec.size() - 1; i >= 0; --i) { int t = vec[i]; string str; while (t) { str += t % 10 + '0'; t /= 10; } if (str == "") str += '0'; while (i != vec.size() - 1 && str.size() < 4) str += '0'; for (int j = str.size() - 1; j >= 0; --j) ans += str[j]; } return ans;}bool bigNum::operator == (const bigNum &a) const { return this->toString() == a.toString();}istream& operator >> (istream &in, bigNum &a) { string t; in >> t; bigNum b(t); a = b; return in;}ostream& operator << (ostream &out, bigNum &a) { out << a.toString(); return out;}int main() { bigNum a("5000"), b(2000000); bigNum c = a * b; cout << c << endl; c = a + b; cout << c << endl; cin >> a >> b; c = a + b * a; cout << c << endl; return 0;}
代码大致是写完了,以后有时间会慢慢升级更新的,因为有写地方还有待优化。
还有,不支持负数、减法、乘法、位运算,本来想一并写了的,不过感觉过于麻烦,还是留到今后有空的时候再更新吧,注释也留到以后更新的时候再写吧。
0 0
- bigNum(大整数)
- 【其他】大整数类Bignum
- Bignum
- BigNum
- openssl BIGNUM
- 大整数
- 大整数
- 大整数
- 大整数
- 大整数与大整数乘法
- 关于openssl BIGNUM
- openssl库中的BIGNUM
- openssl库中的BIGNUM
- 关于openssl BIGNUM
- *foj 1453 Bignum Arithmetic
- 大整数相乘问题
- 大整数相乘算法
- 大整数相乘算法!
- Hadoop Yarn详解
- 接口工厂方法模式解耦与反射机制 Just when I thought that I was out they pull me back
- 【读书笔记】iOS网络-Web Service协议与风格
- <li><img>标签之间空隙解决办法
- Qt的gui编程是,点击一次button出现两次action
- bigNum(大整数)
- C++11:lambda表达式
- The Graveyard Book
- jsp页面在图片上加文字
- 输出9 x 9乘法表
- OBB文件和StorageManager类使用介绍
- Android实战简易教程-第六十七枪(android动画实现窗口抖动效果)
- 初入职场,一点儿自身的感受
- JDK5.0泛型