目录

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)

(C++)高精度整数的存储、读入、比较和四则运算相关推荐

  1. 【算法学习笔记】11:高精度整数A+B、A-B、A*b、A/b

    高精度算法是在计算问题涉及的数据范围超过该程序语言的表示能力时,用数组模拟数学运算的一类算法.本节学习高精度的整数四则运算,其中乘法只要求一个因子是高精度,除法只要求被除数是高精度.以下,用大写字母( ...

  2. Java黑皮书课后题第5章:*5.1(统计正数和负数的个数然后计算这些数的平均值)编写程序,读入未指定个数的整数,判断读入的正数有多少个、负数有多少个,然后计算输入值的总和和平均值(不记0,浮点表示)

    *5.1(统计正数和负数的个数然后计算这些数的平均值)编写程序,读入未指定个数的整数,判断读入的正数有多少个.负数有多少个,然后计算输入值的总和和平均值(不记0,平均值使用浮点表示) 题目 题目概述 ...

  3. java求小数高精度_浅谈Java中的高精度整数和高精度小数

    在实际编码中,会遇到很多高精度的事例,比如,在计算金钱的时候就需要保留高精度小数,这样计算才不会有太大误差: 在下面的代码中,我们验证了,当两个float型的数字相加,得到的结果和我们的预期结果是有误 ...

  4. [高精度整数] N的阶乘 [2006年清华大学计算机研究生机试真题]

    题目描述: 输入一个正整数N,输出N的阶乘. 输入描述: 正整数N(0<=N<=1000) 输出描述: 输入可能包括多组数据,对于每一组输入数据,输出N的阶乘 样例输入: 4 5 15 样 ...

  5. [高精度整数] a+b [2010年华中科技大学计算机研究生机试真题]

    题目描述: 实现一个加法器,使其能够输出a+b的值. 输入描述: 输入包括两个数a和b,其中a和b的位数不超过1000位. 输出描述: 可能有多组测试数据,对于每组数据, 输出a+b的值. 样例输入: ...

  6. java存储整数,用于存储整数数值的是 JAVA四种整数数据类型的取值范围分别是多少...

    JAVA四种整数数据类型的取值范围分别是多少 byte的取值范围为-128~127,占用1个字节(-2的7次方到2的7次方-1) short的取值范围为-32768~32767,占用2个字节(-2的1 ...

  7. java 整数变负数_一文帮你读懂Java整数的存储原理

    前言 大家应该都知道,整数包括负数,零,和正数.在Java中,基本类型中byte(8位).short(16位).int(32位).long(64位)属于整数,并且没有无符号数,均是有符号的.对于计算机 ...

  8. ”高精度整数删去若干位以使剩下的值最小“问题

    问题描述: 键盘输入一个高精度的正整数N(不超过240位) ,去掉其中任意M个数字后剩下的数字按原左右次序将组成一个新的正整数. 编程对给定的N和M,寻找一种方案使得剩下的数字组成的新数最小.输出组成 ...

  9. 华为机试--高精度整数加法

    描述: 输入两个用字符串 str 表示的整数,求它们所表示的数之和. 数据范围: 1≤len(str)≤10000 输入描述: 输入两个字符串.保证字符串只含有'0'~'9'字符 输出描述: 输出求和 ...

最新文章

  1. Resources与StreamingAssets文件夹的区别
  2. tensorflow中的交叉熵损失
  3. mod游戏什么意思计算机,MOD运算
  4. linux内核模块常见问题
  5. 图像视频压缩:深度学习,有一套
  6. oracle判断时间条件相等_判断条件的先后顺序,会引起索引失效么?
  7. 后台的Activity被系统回收怎么办?
  8. 兼容PC、移动端(微信公众号) vue全屏滚动组件 支持vue2和vue3
  9. 安装cygwin软件
  10. 中医经典《伤寒论》-原文
  11. 【MATLAB】报错:数组索引必须为正整数或逻辑值
  12. 服务器磁盘阵列做win7系统,win7 X64 中RIAD0的磁盘阵列怎么组建
  13. 容联携手火星时代教育 促进线上线下一体化
  14. 教你用Python画一棵圣诞树
  15. Excel破解宏密码
  16. html5清除所有,html5 canvas永久清除
  17. octave-移动数据
  18. php指纹登录原理,指纹识别的工作原理-理论方法-敏捷大拇指-一个敢保留真话的IT精英社区...
  19. 【前端开发技术总结一】
  20. mysql查询1999年后出生的_1999年出生的属兔人2021年几岁了

热门文章

  1. 微信支付invalid total_fee 的报错
  2. 14-flutter Animation 动画
  3. 083、Prometheus架构(2019-05-05 周日)
  4. CentOS目录结构超详细版
  5. 百度认为什么样的网站更有抓取和收录价值
  6. (转)如何修改maven的默认jdk版本
  7. apache开启虚拟主机 并进行配置
  8. 硬铺路、软筑墙:三星移动在中国的新路径
  9. 【原】Java学习笔记020 - 面向对象
  10. 新浪微博应用 IE下面框架嵌套框架的问题解决