再回首-无符号大整数加法
2016-07-23 17:03
330 查看
刚才在leetcode上看到一道二进制的加法,随即兴致来了,写了一个可以支持任意(正整数)基底的大整数加法。不过这个是无符号的,有符号其实就多了一点判断,顺便需要实现减法(借位的时候略麻烦,我以前是先比较两个数字的绝对值,用大的减去小的来做的)。
记得以前大一的时候写大整数加法,写了好长,现在的编码能力确实比两年前的自己好了挺多。哈哈,王婆卖瓜而已,不喜勿喷。直接上代码,请君欣赏:
记得以前大一的时候写大整数加法,写了好长,现在的编码能力确实比两年前的自己好了挺多。哈哈,王婆卖瓜而已,不喜勿喷。直接上代码,请君欣赏:
#include <iostream> #include <string> using namespace std; class BigIntegerAddition { public: // 大整数使用字符串表示,base表示数字的基,默认为十进制 string add(string a, string b, size_t base=10) { size_t len = max(a.size(), b.size()) + 1, toAdd = 0, pos; // 先补零,对齐两个数字 align(a, len); align(b, len); string res(len, '0'); for (size_t i = len; i > 0; --i) { // 可以稍微注意一下这里为何要用多一个pos来表示真正的下标,而i只是用来计数的 // 因为size_t类型的最小值为0 // 如果同时用下标来计数的话,是没法终止的,--0就变成很大的数字了 pos = i - 1; toAdd += (a[pos] - '0') + (b[pos] - '0'); res[pos] += toAdd % base; toAdd /= base; } clearZerosPrefix(res); // 由于前面补零,有可能最后最高位并没有进位,所以有多余的零需要去掉 return res; } private: void align(string& str, size_t len) { str.insert(str.begin(), len-str.size(), '0'); } void clearZerosPrefix(string& a) { size_t pos = 0, len = a.size(); while (pos < len && a[pos] == '0') ++pos; if (pos == len) pos = len - 1; a = a.substr(pos); } }; int main() { cout << BigIntegerAddition().add("233", "666") << endl; cout << BigIntegerAddition().add("0", "99") << endl; cout << BigIntegerAddition().add("1", "99") << endl; cout << BigIntegerAddition().add("101", "99") << endl; cout << BigIntegerAddition().add("0", "000") << endl; cout << BigIntegerAddition().add("101", "1", 2) << endl; cout << BigIntegerAddition().add("111", "11", 2) << endl; return 0; }
相关文章推荐
- HTTPS工作原理
- 为什么一些api暴露的id不是整数
- dubbo,MemCache和Nginx初识等服务器组件
- mysql 下 计算 两点 经纬度 之间的距离 含具体sql语句
- parseQueryString
- 深入理解JAVA I/O系列三:字符流详解
- Socket解决粘包问题2
- POJ 2121
- 通过金矿模型介绍动态规划
- 代码块的执行前后
- CCNA系列十二之ACL
- Deep learning 译文 -- 第二部分
- OTP研究记录
- 【iOS开发】在界面上显示“HELLO”
- Codeforces 701B Cells Not Under Attack(模拟)
- Node.js 初体验
- Codeforces Round #364 (Div. 2) C.They Are Everywhere
- 新手老手都离不开八大开发工具
- 计算机科学小知识
- OpenLayers3入门篇-创建点和线