大整数加法基本思路和代码(C++实现)

  • 前言
  • 分析
  • 编程

前言

如果给出两个很大很大的整数,这两个数大到long类型也装不下,比如100位整数,如何求它们的和呢?

Java中有无敌的BigInteger,而C++只能眼气~

  • C/C++中的int 类型能表示的范围是 − 2 31 − 2 31 – 1 -2^{31}-2^{31} – 1 −231−231–1
  • unsigned 类型能表示的范围是 0 − 2 32 0-2^{32} 0−232

分析

回顾起小学数学,当我们需要计算两个较大数目的加减乘除,我们是用列竖式的方式来计算的。

因为对于较大的整数,我们无法一步就直接计算出结果,所以不得不把计算过程拆分成一个一个小步骤来完成。

不仅仅是人脑,对于计算机来说也可以这样解决。程序不可能通过一条指令计算出两个大整数之和,却可以像列竖式一样将运算拆解成若干小运算。

可是,如果大整数超出了long型的范围,该如何存储这个数呢?

我们想到了数组,可以用数组的每一个元素存储整数的每一个数位。演示过程

于是这变成了一个模拟题!

编程

(1)编程思路。

  • 首先要解决的就是存储 200 位整数的问题。显然,任何C/C++固有类型的变量都无法保存它。最直观的想法是可以用一个字符串来保存它。

  • 由于字符串本质上是一个字符数组,因此为了编程更方便,可以用数组unsigned a[200]来保存一个200 位的整数,让a[0]存放个位数,a[1]存放十位数,a[2]存放百位数……。

  • 实现两个大整数相加的方法很简单,就是模拟小学生列竖式做加法,从个位开始逐位相加,超过或达到10 则进位。

#include <iostream>
#include <string>
using namespace std;//s1和s2用来读入要做加法的数
// char s1[1005], s2[1005];
string s1, s2;
//n1和n2是用来倒着存输入的大整数的,ans是用来存储加法运算后的结果的
int n1[1005], n2[1005], ans[1005];//大整数加法
int main(){cin >> s1 >> s2 ;
//    用下标为0的位值来存字符串的长度n1[0] = s1.size();n2[0] = s2.length();
//    用i去控制循环,用j去控制数组倒着存下输入的字符串for(int i = 0, j = n1[0]; i < n1[0]; i++, j--){//s1是字符数组,要它变成数字,需要减去一个字符0,完成隐式转换,s2同n1[j] = s1[i] - '0';}for(int i = 0, j = n2[0]; i < n2[0]; i++, j--){n2[j] = s2[i] - '0';}ans[0] = max(n1[0], n2[0]);//取两个字符串位数的最高位for(int i = 1; i <= ans[0]; i++){ans[i] += n1[i] + n2[i];if(ans[i] > 9){ans[i + 1] += 1;ans[i] %= 10;if(i == ans[0]){  // 如果最后一位进位了,则长度++++ans[0];}}}
//  将答案再倒回来输出结果for(int i = ans[0]; i > 0; i--){cout << ans[i];}cout << endl;return 0;
}

https://zhuanlan.zhihu.com/p/366210293

#include <iostream>
#include <cstring> //因为用到了c的strlen,所以要引用这个库函数
using namespace std;//强调一下我这里的数组都比原来多开了5个是防止溢出//s1和s2用来读入要做加法的数
char s1[1005], s2[1005];
//n1和n2是用来倒着存输入的大整数的,ans是用来存储加法运算后的结果的
int n1[1005], n2[1005], ans[1005];//大整数加法
int main(){cin >> s1 >> s2 ;
//    用下标为0的位值来存字符串的长度n1[0] = strlen(s1);n2[0] = strlen(s2);
//    用i去控制循环,用j去控制数组倒着存下输入的字符串for(int i = 0, j = n1[0]; i < n1[0]; i++, j--){//s1是字符数组,要它变成数字,需要减去一个字符0,完成隐式转换,s2同n1[j] = s1[i] - '0';}for(int i = 0, j = n2[0]; i < n2[0]; i++, j--){n2[j] = s2[i] - '0';}
//也可以把加和for循环结合在一起,分开只是为了增加可读性
//    加ans[0] = max(n1[0], n2[0]);//取两个字符串位数的最高位for(int i = 1; i <= ans[0]; i++){ans[i] = n1[i] + n2[i];}
//    进位for(int i = 1; i <= ans[0]; i++){if(ans[i] > 9){ans[i + 1] += ans[i] / 10;ans[i] %= 10;if(i == ans[0]){++ans[0];}}}
//  将答案再倒回来输出结果for(int i = ans[0]; i > 0; i--){cout << ans[i];}cout << endl;return 0;
}

加油!

感谢!

努力!

大整数加法基本思路和代码(C++实现)相关推荐

  1. 大整数加法计算思路与算法实现

    参加MOOC PKU的程序设计专项课程学习,目前进度到C++.这门课太烂了,完全就是自学,作业还相当难!!!!比如这里week4的这题,其实是把poj上的大整数的加.减.乘.除合并到一题里面,这个代码 ...

  2. openjudge 1.6.10 大整数加法

    OpenJudge - 10:大整数加法 解题思路: 1.大整数加法,对应的是高精度加法算法,利用数组模拟来解决 2.首先,明确long long范围都放不下的整数,我们应该想到用数组的方法,如果采取 ...

  3. 信息学奥赛一本通 1168:大整数加法 | OpenJudge NOI 1.6 10:大整数加法

    [题目链接] ybt 1168:大整数加法 OpenJudge NOI 1.6 10:大整数加法 [题目考点] 1. 高精度 考察:高精加高精 高精度计算讲解 [解题思路] 注意:输入可能有多余的前导 ...

  4. 信息学奥赛一本通(1168:大整数加法)

    1168:大整数加法 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 44610     通过数: 14295 [题目描述] 求两个不超过200位的非负整数的和. ...

  5. 信息学奥赛一本通(c++):1168:大整数加法

    一.题目 1168:大整数加法 时间限制: 1000 ms         内存限制: 65536 KB [题目描述] 求两个不超过200位的非负整数的和. [输入] 有两行,每行是一个不超过200位 ...

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

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

  7. C++解决大整数加法

    c++解决大整数加法 问题描述:求两个不超过200为的非负整数的和 输入数据:输入有两行,每行是一个不超过200位的非负整数,没有多于的前导0. 输出要求:输出只一行,即相加后的结果.结果里不能有多于 ...

  8. 大整数加法——C语言

    高精度计算--大整数加法 这是我写过的程序,主要也是为记录和学习,以下代码是该程序的思路和答案(注释是我自己写的),如有不对,请指出. 问题描述 求两个不超过200位的非负整数的和. 输入数据 有两行 ...

  9. C++实现大整数加法

    大整数加法可谓是学习C++语言的一个里程碑.那么,如何在C++简单易懂地实现大整数加法呢? 概念思路 假定这两个十进制的大整数位数不超过255位. 那么,可以定义两个长度为255的字符数组(num1, ...

最新文章

  1. 为什么 SQL 语句不要过多的 join?
  2. C++迪杰斯特拉算法求最短路径
  3. oracle登陆无效参数是啥意思,关于参数无效的详细介绍
  4. Solaris9 Sparc下安装JDK6.0和tomcat6.0
  5. EBS并发管理器启动失败,系统暂挂,在重置计数器之前修复管理程序
  6. python给视频加水印_视频水印_Python SDK_服务端SDK_视频点播 - 阿里云
  7. python读取第二行_从CSV文件读取第二行到Python
  8. How does UDO tool resolve objects
  9. Python+tkinter实现超时无键盘操作自动退出
  10. WinForm LED循环显示信息,使用定时器Threading.Timer
  11. mysql分组查询获取分组中某个字段值最小的一条数据
  12. sp.net MVCJQuery 应用(表单验证)
  13. java day16 【异常、线程】
  14. dhcp协议_什么是DHCP?总结DHCP优缺点和工作原理
  15. 机器人工程师学习计划(计算机相关专业学习计划)
  16. 处理自己计算机某的端口被占问题
  17. 数学竞赛书单该怎么选?金牌牛娃用的书都在这里了!
  18. 解决Linux下adb devices找不到设备
  19. 移动硬盘在mac上无法显示
  20. 芥川龙之介《烟草与魔鬼》

热门文章

  1. 2023年,哪些Web3赛道的表现最值得期待?(文末有奖)
  2. python画三维(3D)图
  3. 携手共进 冲量在线与宇信科技签署战略合作协议
  4. 交换机路由器的基本配置
  5. golang-math实用小技巧
  6. SVG中年月日相关的表达式
  7. 关于惠普系列电脑无法开机以及其他问题解决的总结
  8. ABP入门系列之1——ABP总体介绍
  9. 梦幻西游手游经验任务链计算机,梦幻西游手游任务链帮派求助刷经验技巧
  10. Mac电脑用预览功能调整图像大小?Mac调整图片大小方法