(C++)高精度整数的存储、读入、比较和四则运算
目录
1. 存储
2. 读入
3. 比较大小
4. 加法
5. 减法
6. 高精度整数和低精度整数的乘法
7. 高精度整数除以低精度整数
高精度整数,又称大整数,其含义就是用基本数据类型无法存储其精度的整数。如:10进制下有着1000个数位的整数。
低精度整数,就是可以用基本数据类型存储的整数。
1. 存储
采用整型数组顺位存储,即整数高位存储在数组高位。为了方便随时获取长度,因此定一个int len和int []组成结构体bign(取自big number)。
同时在结构体中使用构造函数,进行初始化。
struct bign{int d[1000];int len;bign(){memset(d,0,sizeof(d));len = 0;}
};
2. 读入
作为字符串读入,再把字符串另存至bign结构体。
由于是顺位存储,因此字符串要逆着输进结构体数组,同时记得 -‘0’ 将字符转化为整数
下面是将字符串转化为bign结构体的函数
bign change(char s[]){bign bg;bg.len = strlen(s);for(int i=0;i<bg.len;i++){bg.d[i] = s[bg.len-1-i] - '0';}return bg;
}
3. 比较大小
原理:先比较两个大整数的长度,更大的直接胜出;从高位到低位逐位比较大小,直至出现某一位不相等,那一位上更大胜出。
结果为int型,如果第一个大于第二个,返回1,等于返回0,小于返回-1。
int compare(bign a,bign b){if(a.len>b.len)return 1;else if(a.len<b.len)return -1;else{for(int i=a.len-1;i>=0;i--){if(a.d[i]>b.d[i])return 1;else if(a.d[i]<b.d[i])return -1;}return 0;}
}
4. 加法
原理:从低位到高位逐位相加,每一个和的个位保留在原位,十位进到更高位。
c = a + b (a>=0,b>=0 )
注意:遍历的过程中位数取a和b中位数更多的那个,结果可能超过a和b的长度。
bign add(bign a,bign b){bign c;int carry = 0;//进位 int sum;for(int i=0;i<a.len||i<b.len;i++){sum = a.d[i] + b.d[i] + carry;c.d[c.len++] = sum%10;carry = sum/10;}//对于高于a和b的那个位数是否有数字取决于进位的最后值if(carry)c.d[c.len++] = carry; return c;
}
注意,这里的加法只适用于两者都是非负的。如果有一个是负的,应该采用高精度减法,如果两个都是负的,就先转化成正的相加最后加上负号。
5. 减法
原理:从低位到高位逐位相减,不够的向上一位借。最后对结果的长度进行纠正,从最高位开始,如果那一位上的数字是0,那么长度减一,但是长度不会为0至少为1。
不用担心向高位借但是高位也是0,因为短暂变成-1之后在下一轮比较时会向更高位借。
c = a - b (a>=b>=0)
bign sub(bign a,bign b){bign c;for(int i;i<a.len||i<b.len;i++){if(a.d[i]<b.d[i]){a.d[i+1] --;a.d[i] += 10;}c.d[c.len++] = a.d[i]-b.d[i];}while(c.d[c.len-1]==0&&c.len>1){//矫正位数,高位是0就长度减1,但是长度至少为1 c.len --;}
}
注意:这里要求被减数不小于减数,如果不满足要求,需要先把两个数进行交换。
6. 高精度整数和低精度整数的乘法
得到的自然是高精度整数。
原理:bign从低位开始逐位和int的整体相乘,得到的结果个位保留在本位,其余高位(不是十位)进到下一步运算。
bign c = bign a * int b
bign multi(bign a,int b){bign c;int carry = 0;int product;//乘积for(int i;i<a.len;i++){product = a.d[i]*b + carry;c.d[c.len++] = product%10;carry = product/10;}while(carry){//注意此处和加法的区别 c.d[len++] = carry % 10;carry /= 10;} return c;
}
7. 高精度整数除以低精度整数
得到的是高精度整数(低精度实际上可以视为高精度的子集)。
原理:bign从高位到低位逐位对int进行除操作,除之前余数*10加上当前位(开始把余数写成引用“引用”的形式传入是为了直接对原变量进行修改,最后得到的余数也就是结果),如果不够除(当前位已经被加到余数中),则当前位记为0,够除则将除得的商留在当前为,除得的余数用来更新余数。
(a + r)/b = c 余数r(存到传进的作为余数的变量r)
bign divide(bign a,int b,int& r){//调用的时候r是int类型的bign c;c.len = a.len;for(int i = c.len-1;i>=0;i--){r = r*10 + a.d[i];if(r<b)c.d[i]=0;else{c.d[i] = r/b;r = r%b;}}//矫正位数while(c.d[c.len-1]==0&&c.len>1){//矫正位数,高位是0就长度减1,但是长度至少为1 c.len --;}return c;
}
summary:
加和乘最后需要根据进位有无增加长度(新增位上当然要有数值)
减和除最后需要根据高位有无减少长度(但是边界是长度至少为1)
相关文章:
TP-link 设置MAC地址过滤
如果你想限制上网的人数,你可以在路由中设置MAC地址过滤,或IP地址过滤 以下以MAC地址过滤为例: http://192.168.1.1/ 输入用户名,密码登录 进入介面: “开启防火墙(防火墙的总开关)” 也要打上…

flask的客户端服务端
1.首先要进行后端与前端的连接有get 和post请求 get请求是直接在网页上打出已将定义好的网址 if __name__ __main__: app.run(host"localhost",port8800)host也可以写ip地址2.在进行交互前需要提前引入 flask 模块 pip3 install Flask详细代码 1 import json2 #…

1023 Have Fun with Numbers
考察大数乘法(整型是2)或者加法(两个相同的数字相加),然后将两个大数用到的0-9的个数比对。 进入比对前先判断长度是否相等,如不等,说明一定不是原序列。 一些需要注意的细节: 1. 字符串的字符转化为整数时不要忘记 减0 2. 封…

Oracle中Hint深入理解(原创)
http://czmmiao.iteye.com/blog/1478465 Hint概述 基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻了DBA的负担。但有时它也聪明反被聪明误,选择了很差的执行计划,使某个语句的执行变得奇慢无比。 此时就…

css sprites之圆角
第一步:创建我们的 Sprite用PS等工具合成如图所示的图片(以一个像素的红线来区分)第二部分:编写HTML代码首先,我们会给容器 div 一个 .roundedBox类 :<div class"roundedBox"></div> 现在,我们必…

爬虫原理与数据抓取----- urllib2:URLError与HTTPError
urllib2 的异常错误处理 在我们用urlopen或opener.open方法发出一个请求时,如果urlopen或opener.open不能处理这个response,就产生错误。 这里主要说的是URLError和HTTPError,以及对它们的错误处理。 URLError URLError 产生的原因主要有&…

1024 Palindromic Number
1. 本题给的N的范围是10位以内的整数,但是注意了不知要要和反序列相加多少次,因此大数的int d[]的大小10是远远不够,100才全部AC。 2. 一开始不通过不知道是位数不够,以为是到确定步数停下来的代码写错了,其实通过两个…

HibernateTemplate 查询
Spring中常用的hql查询方法getHibernateTemplate()上 一、find(String queryString); 示例:this.getHibernateTemplate().find("from bean.User"); 返回所有User对象 二、find(String queryString , Object value); 示例:this.getH…

EMQ学习笔记---Clean Session和Retained Message
MQTT会话(Clean Session)MQTT客户端向服务器发起CONNECT请求时,可以通过’Clean Session’标志设置会话。‘Clean Session’设置为0,表示创建一个持久会话,在客户端断开连接时,会话仍然保持并保存离线消息,直到会话超时…

JPA相关--Annotation
1.自定义注解import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;Target(ElementType.METHOD) //指定可以用在什么地方,默认所有地方 Retention(…

(C++)变长数组vector的常见用法
目录 1. vector的定义 2. vector内的元素访问 3. vector常用函数 push_back(x) pop_back() size() clear() insert(it,x) erase(it)和erase(first,last) 4. vector常见用途 1.存储数据 2.用邻接表存储图 1. vector的定义 1.1 单独定义vector vector<typename&…

【kuangbin专题】计算几何_半平面交
1.poj3335 Rotating Scoreboard 传送:http://poj.org/problem?id3335 题意:就是有个球场,球场的形状是个凸多边形,然后观众是坐在多边形的边上的,问你是否在球场上有个地方可以放一个记分牌,然后所有的观众…

设计模式之状态模块加观察者模式
背景: 用户操作鼠标,涉及的动作有左击、右击、双击。每种动作对应一种状态,状态的切换对应着不同的鼠标点击事件。 类图: 状态接口类: /*** 状态接口**/ public interface State {public void change(); } 鼠标移入类&…

objectdatasource中delete的尴尬。
这里用的是listview和objectdatasource。本来是为了省力直接用了objectdatasource,这可倒好为了一个不知名的问题折腾了半天。首先,本来用objectdatasource,里面的各种method,比如delete,update等等,对应的…

1039 Course List for Student
1. 此题必须采用vectorhash的策略,否则最后一个用例超时,定义一个vector类型的数组,长度由名字的最大范围决定 vector<int> stus[26*26*26*10]; 2. 起初我定义了结构体,里面用一个字符串存放学生的名字,vector…

《编程匠艺》读书笔记
《编程匠艺》读书笔记之一 《编程匠艺》读书笔记之二 《编程匠艺》读书笔记之三 《编程匠艺》读书笔记之四 《编程匠艺》读书笔记之五 《编程匠艺》读书笔记之六 《编程匠艺》读书笔记之七 《编程匠艺》读书笔记之八 《编程匠艺》读书笔记之九 《编程匠艺》读书笔记之十 《编程…

【转】C语言的memset函数
http://vip.6to23.com/tenax/clib/string/memset.htmlhttp://hi.baidu.com/longchengjiang/blog/item/32c0e243acb8191772f05d29.htmlhttp://www.cnblogs.com/xray2005/archive/2009/07/07/1518288.html 原型:extern void *memset(void *buffer, int c, int count);…

一个6年iOS程序员的工作感悟,送给还在迷茫的你
前言 每一个开发者,都有一段不愿提起的经历,很多年前,刚刚从大学毕业的时候,很多公司来校招。其中最烂俗的一个面试问题是:“你希望你之后三到五年的发展是什么?”。我当时的标准回答是(原话&am…

1063 Set Similarity
1. 这题需要利用set容器的去重功能,因此使用set来存放每一组的数据。 2. 起初我的计算相似度的函数是这样设计的:传入set1和set2,声明一个set3,将set1中的数据全部插入set3中,再声明一个重复元素个数same_n࿰…

Volume是如何工作的
在这篇文章中,我会尽最大的努力来解释Volume是如何工作的,并展示一些最佳实践。这篇文章主要是针对那些对Volume不了解的Docker用户,当然有经验的用户也可以通过本文了解一些Volume的细节。想要了解Docker Volume,首先我们需要知道…

使用 TFDConnection 的 pooled 连接池
从开始看到这个属性,就一直认为他可以提供一个连接池管理功能, 苦于文档资料太少, 甚至在帮助中对该属性的使用都没有任何介绍,如果你搜索百度,也会发现基本没资料。 最后终于在其官方网站看到了其完整相关的英文资料&…

Java与UML交互图
Java与UML交互图 前面我们主要讨论的是UML类图,下面我们要讨论的是另一种UML图——交互图(Interaction Diagram)。交互图描述的是一组对象之间的交互过程,或者说,这里我们实际上要回答这样一个问题:“方法调…

1054 The Dominant Color
1. 此题用到了map<string,int>将输入的颜色(long long也存不下,只好作为string存入)的次数记录,看来默认一个没出现过的string对应的int是0。因此记次数的时候 if(mp[str])mp[str] 1;//如果不是第一次出现,出现次数1 else mp[str] …

通过sqlserver日志恢复误删除的数据
通过sqlserver日志恢复误删除的数据 原文:通过sqlserver日志恢复误删除的数据如果你已经急的焦头烂额,看到这篇文章的时候,请你换个坐姿,深呼吸几次,静下心来将这篇文章读完,也许你的问题迎刃而解。 我遇到的情况是这样…

关于在phpStudy环境下,windows cmd中 php不是内部命令问题
首先查看system32是否加入系统变量 其次要把当前运行的php版本的路径加入到系统变量中去,path中, 一定要是这个样子的; D:\phpStudy\php\php-5.6.27-nts 不然没有什么用。 这样在phpstorm中以及cmd中都可以使用php命令了。

如何用javascript控制上传文件的大小
以下是引用片段:<form nameMyform οnsubmit"return CheckFileSize()"> <input typefile namephoto><br/> <input typesubmit valuesubmit></form> <SCRIPT LANGUAGE"JavaScri…

1071 Speech Patterns 需再做
1. alphanumerical 的意思是字母数字混合编制的,也就是一句话中被认为是“单词”的组成成分的有数字和字母。这也是为什么例句中can1不被认为是can。 由于这道题对大小写不敏感,不妨在读入后,把大写字母全部改成小写 //大写换小写 for(int…

IOS类似9.png
图形用户界面中的图形有两种实现方式,一种是用代码画出来,比如Quartz 2D技术,狠一点有OpenGL ES,另一种则是使用图片。 代码画的方式比较耗费程序员脑力,CPU或GPU; 图片则耗费磁盘空间,会增加app的体积.一般的app我们会偏重于使用…

Shell 编程
Shell 是一个用 C 语言编写的程序,通过 Shell 用户可以访问操作系统内核服务。它类似于 DOS 下的 command 和后来的 cmd.exe。Shell 既是一种命令语言,又是一种程序设计语言。Shell script 是一种为 shell 编写的脚本程序。Shell 编程一般指 shell 脚本编…

表现层框架Struts/Tapestry/JSF架构比较 [转]
http://www.jdon.com/artichect/sjt.htm Struts/Tapestry/JSF是目前J2EE表现层新老组合的框架技术。从诞生时间上看,Struts应该比较早,使用得非常广泛,Tapestry 3.0逐渐引起广泛的重视,正当Tapestry即将大显身手时期,S…