什么是大整数BigInteger?

假设某一数字有1000,一般这种数字就是就叫BigInteger,这种数字即使使用unsigned long long 类型也无法表示(unsigned long long的最大值:18446744073709551615)

如何处理BigInter?

这个时候我们如何处理这种类型的数字呢?机器不能算,我们可以靠人工来计算, 就是小学生都会的简单加减乘除四则运算。
这种数据我们一般用一个数组来表示,用char类型(或者C++的string)把一串大整数当做字符串来读取,然后将这些字符转换成纯数字(-‘0’),由于我们做加减乘除都是从后往前,所以我们采用倒序存储的方法,比如 “123456”我们存到数组里时令
arr[ 0 ] = 6 ,
arr[ 1 ] = 5 ,
arr[ 2 ] = 4 ,
arr[ 3 ] = 3,
arr[ 4 ] = 2 ,
arr[ 5 ] = 1

处理代码(C++)

void change(string ss, vector<int> &arr) //vector写在了main函数中,于是用了下引用
{for(int i = ss.length()-1; i>=0; i--)arr.push_back(ss[i]-'0');
}

BigInteger之间的比较

如果整数a的长度大于b,那么a大于b;反之b大于a
如果a b长度相等,按每一位大小比较
代码如下

int comp(vector<int> &a, vector<int> &b)
{if(a.size() > b.size()) return 1; //a > belse if(a.size() < b.size()) return -1;else{for(int i = a.size()-1; i >= 0 ; i--) // 从高位向低位比较{if(a[i] > b[i]) return 1;else if(a[i] < b[i]) return -1;}}return 0; //a = b
}

四则运算

负数我就不处理了XD
这里有个注意点,定义的temp(临时变量)和carry(进位数)都是int类型的,也就是说如果计算时超过了这个类型最大值就会发生溢出,改用 long long就没问题了
下面代码均用int,请注意。

加法

相当于实现普通的竖式加法

vector<int> add(vector<int> a, vector<int> b)
{int carry = 0; //进位变量vector<int> cc;//答案存储到该数组中for(int i = 0; i< a.size() || i < b.size(); i++){if(i >= a.size()) a.insert(a.begin()+i, 0);//如果位数不够,最前端插一个0if(i >= b.size()) b.insert(b.begin()+i, 0);int temp = a[i] + b[i] + carry;cc.push_back(temp % 10); //当前位的值carry = temp /10;// 进位的值}if(carry != 0)    //最高位有进位时,在最前端插入cc.insert(cc.begin()+cc.size(), carry);return cc;
}

减法

减法也是竖式模拟,实际上并没有看起来代码写的这么麻烦,只是vector不如c的数组那么灵活(但安全性更高)所以多余步骤比较多
这里有个vector的坑,end()指向的是vector最后一个元素的后面,删除高位0的元素是不要忘记这一点

vector<int> sub(vector<int> a, vector<int> b)
{vector<int> cc;for(int i = 0; i< a.size() || i< b.size(); i++){if(i >= a.size()) a.insert(a.begin()+i, 0);if(i >= b.size()) b.insert(b.begin()+i, 0);if(a[i] < b[i]){a[i+1]--;a[i] += 10;}cc.push_back(a[i] - b[i]);}while(cc[cc.size()-1] == 0 && cc.size() > 1)cc.erase(cc.end()-1);return cc;
}

乘法(BigInteger X int)

实现Biginteger 与 int 的乘法,令BigInteger的第一位与int相乘,取个位数作为本位的值,其余值进位,下一位做乘法后再加上进位的值,直到数组内部数字全部乘完毕,将最后的进位作为最高位。

vector<int> multi(vector<int> a, int b)
{vector<int> cc;int carry = 0; //进位数字for(int i = 0; i< a.size(); i++){int temp = a[i] * b + carry;cc.push_back(temp %10);carry = temp / 10;}while(carry != 0){cc.push_back(carry%10);carry /= 10;}return cc;
}

除法(BigInteger / int)

除法和竖式的除法也基本相同,所以要从最高位开始往最低位除。
先拿出最高位,除以 除数,得到该位结果,对除数取余,乘10加到次高位上,然后这样反复作除,直到最低位除以除数后余数就丢掉

vector<int> divide(vector<int> a, int b)
{vector<int> cc;reverse(a.begin(), a.end()); //反转数组int carry = 0;for(int i = 0; i<a.size(); i++){int temp = a[i] + carry *10;cc.push_back(temp / b);carry = temp % b;}//循环结束后carry的值就是余数while(cc[0] == 0){cc.erase(cc.begin());}return cc;
}

大整数BigInterger的简单入门(vector实现)相关推荐

  1. 大整数加法(简单算法)

    大整数加法首先要了解加法的算法,具体思路很简单: 从低位到高位开始加,需要进位,正向数组是高位在前,所以需要反向数组开始加法. 代码如下,写的麻烦了一点: #include<stdio.h> ...

  2. 大数据之Hadoop3简单入门(一)(通俗易懂)

    目录 一. 大数据基础概论 1.1 何为大数据 2.1 大数据特点(4V) 2.1.1 Volume(大量) 2.2.2 Velocity(高速) 2.2.3 Varity(多样) 2.2.4 Val ...

  3. 【博学谷学习记录】超强总结,用心分享 | 狂野大数据shell编程—简单入门

    目录 前言 一.shell简介 二.入门案例 1.编写shell脚本 2.shell的运行方式 3.shell的数据类型 4.shell的变量 5.shell的字符串 6.shell的运算符 7.sh ...

  4. 为什么c语言会入门到入土,大整数从入门到入土

    大整数(高精) 声明,这是一篇从入门到入土的大整数讲解,可能有那么一点小长,内容涵盖大整数加法,减法和乘法,但由于水平有限,还是有不足之处希望评论提出.如果你是一个萌新,相信我,我会写得非常详细,你一 ...

  5. 【FFTNTT入门】大整数乘法

    问题:给定两个大整数 A A A 和 B B B, A A A 和 B B B 的长度为 n n n 和 m m m,求 A A A 和 B B B 的乘积 1. 朴素做法 思考小学数学中两个数的乘法 ...

  6. delphi指针简单入门

    delphi指针简单入门:         看一个指针用法的例子:     1         var     2             X,   Y:   Integer;       //   ...

  7. [Nowcoder] 大整数相乘(拼多多笔试题)

    有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示.不能用系统自带的大整数类型. 输入描述: 空格分隔的两个字符串,代表输入的两个大整数 输出描述: 输入的乘积,用字符串表示 输入例 ...

  8. 大整数乘法--leetcode Multiply Strings

    大整数乘法 本文转载自http://www.cnblogs.com/TenosDoIt/p/3735309.html 我们在日常的大整数计算中,通常是把它转化为字符型计算.这道题的思路就和我们小学计算 ...

  9. 循环相乘取整法C语言,华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)...

    题目描述: 输出两个不超过100位的大整数的乘积. 输入: 输入两个大整数,如1234567 123 输出: 输出乘积,如:151851741 样例输入: 1234567 123 样例输出: 1518 ...

最新文章

  1. 什么阻碍了人工智能在制造业的应用?
  2. JS如何设置打开页面后将光标定位在指定的输入框?
  3. 浮点数相加php,利用php怎么实现一个浮点数精确运算功能
  4. Python 线程(二):简单锁实现线程同步
  5. 我是程序员,我比较喜欢有纪律的团队。
  6. 制作HTML类型的email邮件 Background Images and CSS in HTML Email
  7. Python基本操作(五) 标准数据类型(不可变类型)
  8. java写法可能存在的 java.lang.OutOfMemoryError: Java heap space 问题
  9. 想系统的学习一下项目管理,有什么好的书籍推荐吗?
  10. atmega128 bootloader程序在IAR-AVR下 linker文件的配置及原因
  11. autoload.php beanbun_PHP爬虫框架Beanbun使用
  12. 斯坦福全球测试,四国本科生CS技能大比拼,中国学生竟然输在了考试上?!...
  13. 算法的衡量:时间复杂度和空间复杂度
  14. python 实现图片批量加入水印!
  15. 视频分享 500 G JAVA视频网盘分享(JEECG开源社区)
  16. 【文本分析】基于粤港澳大湾区博物馆访客评价的文本分析
  17. dnf剑魂buff等级上限_DNF:剑魂职业改版加强,超一线剑魂职业如何技能加点?...
  18. 沪江易未来:沪江网校前端架构漫谈
  19. 单片机智能小区安防系统
  20. NXP官方 NFC 天线设计工具NFC Antenna Design

热门文章

  1. 如何打开.xmind文件
  2. 低代码开发与传统开发有什么不同?有什么价值?
  3. 学习笔记之《Android项目实战——手机安全卫士》
  4. python魔法方法学不懂_Python--魔法方法学习
  5. 改变vim配色:安装colorscheme
  6. 可读代码编写炸鸡三 - 审美
  7. Android Studio 中列表视图(ListView)的应用
  8. 网吧服务器安装php吗,网吧无盘服务器安装备忘录-2017
  9. Open-cv中由cv2.drawContours(contours_img,cnts,-1,(0,0,255),3) 造成的cv2.error
  10. 外设驱动库开发笔记52:PM3003S激光粉尘仪驱动