一点一点解读紫书中例子--大整数类BigInteger (1)
首先贴上前一部分代码:
struct BigInteger {static const int BASE = 100000000;static const int WIDTH = 8;vector<int> s;BigInteger(long long num = 0) { *this = num; }BigInteger operator = (long long num) {s.clear();do {s.push_back(num % BASE);num /= BASE;} while(num > 0);return *this;}BigInteger operator = (const string &str) {s.clear();int x, len = (str.length() - 1) / WIDTH + 1;for(int i = 0; i < len; ++i) {int end = str.length();int start = max(0, end-WIDTH);sscanf(str.substr(start, end-start).c_str(), "%d", &x);s.push_back(x);}return *this;}
};
这里有几个问题:
- *this是什么?
首先我们得知道 this 是一个指向该结构体的指针,所以*this = num;
就是为了在使用struct声明变量时对变量进行初始化。 - BigInteger operator = (long long);
个人认为此函数作用不大,因为形参是long long类型,所以一旦程序需要处理的数据大于long long的范围,这样一来此数据就无法准确的传入这个函数,这样一来就不能指望这个函数能给出正确的结果了。 BigInteger operator = (const string);
我认为这个函数才是最有用的,首先形参是以字符串的形式传入,这样我们就不用担心上面那种情况的出现了。接下来就是对字符串的处理,这里先介绍一下这几个函数:sscanf()函数:这里写一个例子,简单理解一下这个函数的作用。
char s[20]; sscanf("Helloworld", "%s", s); printf("%s", s); //输结果是Helloworld
substr()函数:也写一个例子,简单理解一下:
string str = "Helloworld"; string str2 = str.substr(3, 3); //str2:low
c_str()函数:可以看一下https://zhidao.baidu.com/question/104592558.html
现在步入正题:
首先不难看出作者的意图:通过vector<int> s
来分段保存大数据的值,每满8位数存一次,为什么是8位数呢?看了http://blog.csdn.net/mrcrack/article/details/53263235,我就知道对于两个8位数相加可能等于9位数,而int最多只能保存到2147483647,这样一来使用8位数一存就十分保险。
len
表示一共可以分为几个8位数,不足8为按8位计算。
接下来的有了上面那些函数就不难理解了。
一点一点解读紫书中例子--大整数类BigInteger (1)相关推荐
- (大整数类Biginteger)大斐波数
题目 Fibonacci数列,定义如下: f(1)=f(2)=1 f(n)=f(n-1)+f(n-2) n>=3. 计算第n项Fibonacci数值. 输入 输入第一行为一个整数N,接下来N行为 ...
- 在php中将5按位与运算,PHP 5.2和PHP 5.3中对大整数的按位运算(Bitwise operations on big integers in PHP 5.2 and PHP 5.3)...
PHP 5.2和PHP 5.3中对大整数的按位运算(Bitwise operations on big integers in PHP 5.2 and PHP 5.3) 我将省略有关我是如何做到这一点 ...
- java 大整数编程_Java编程--RSA算法中的大整数运算
Java编程–RSA算法中的大整数运算 RSA原理浅析 RSA是利用陷门单向函数实现的,其安全基础依赖于大整数的分解问题的难解性 算法过程 为了加深对RSA算法的了解,接下来通过简单的一个例子来分析一 ...
- 关于大整数类加减法算法的一些思考
这几天做C++作业,有一道题要求实现大整数类,即不受内部数据类型表示范围限制的大数四则运算,比如123456789987654321987654321+987654321234567898765432 ...
- ACM与Java -- 大整数类的常用函数一览表
BigInteger abs() 此方法返回一个BigInteger,其值是此BigInteger的绝对值. 2 BigInteger add(BigInteger val) 此方法返回一个BigI ...
- C++应用之自定义大整数类
写在前面:C语言在应用时有很多整数溢出的情形,如果运算结果很大,就需要用到所谓的高精度算法,即用数组来储存整数,并模拟手算的方法进行四则运算,这些算法并不难实现,但是考虑到易用性问题,即如果能像使用i ...
- Java中过大整数储存问题(bushi
当我们想定义一个变量来储存一个过大整数(这里举例用2147483648,是因为他已经大出int类型最大值2147483647) 故使用long定义变量,如下: public class 过大整数储存问 ...
- java大整数类减1,自己写Java大整数《1》表示和加减
自己写Java大整数<一>表示和加减 上周粗略计划自己写Java下的大整数运算. 后来仔细想想其实自己动手写大整数运算有1好2不好.2个不好分别是: 1,肯定没有Java内置的BigInt ...
- 《Intel汇编语言程序设计》书中例子编译
刚看到这例子是纠结了--编译不过啊,google后看到不少人便不过--后来经过一番查询,找到了编译方法 用masm615编译: 除了在例子里连接必要的lib文件外,就是设置masm615的环境变量了, ...
最新文章
- mybatis 一对多_Springboot整合Mybatis实现级联一对多CRUD操作
- 【android API】 ListView api 翻译
- MyBatis参数名称解析器-ParamNameResolver解析
- 20180517 迭代器
- MyBatis3源码解析(6)TypeHandler使用
- 盘点抖音及今日头条的优化推广方法有哪些?
- Ubuntu搜索不到WiFi的解决办法
- SSH学习2_ssh登陆卡住(expecting SSH2_MSG_KEX_ECDH_REPLY)
- AliSQL主从复制
- java excel转pdf linux_docker安装libreoffice并实现把Excel转为pdf
- android ibeacon距离,iBeacon使用蓝牙连接范围精确到1-3米
- java中ArrayList小案例(快敲20遍++)
- 长期宅在家的人都有什么比较好的室内锻炼的方法?
- JSF集成Spring
- 一份机器学习的自白书
- And and Pair
- layui复选框默认选中
- 浪潮IPBS9505S短接线刷固件(附教程)
- C++:char数组初始化
- 秋冬饮品研发没思路?带你看新品5大趋势!
热门文章
- winrar6.0汉化中文版 v6.00烈火版
- 奇虎360_2017校园招聘笔试编程题第一题
- Linux安装时分区跳过硬盘锁,安装Linux系统对硬盘分区时,必须有两种分区类型: 和 。...
- Matlab中Web的用法
- 怎么把照片压缩变小?如何改变图片的大小?
- 怎么安装计算机一级光盘,讲解光盘如何装系统
- 滨江学院c语言期中考试试题,南信大滨江学院linux期末作业.doc
- sql盲注 各种方法拿到 管理员账户和密码
- 土地生命周期管理-土地储备
- 从零开始创建一个Android主屏幕Widget