高精度加法

简介

用于计算含有超过一般变量存放不下的非负整数

高精度加法这个过程是模拟的小学竖式加法计算

步骤

以下有顺序之分

  • 数组清零
  • 输入
  • 获取长度
  • 逆置
  • 字符型数字转成对应的整型数字
  • 计算并输出

简单来看重要的步骤也就以下几步

  • 清零
  • 逆置
  • 转换
  • 相加计算(包含进位)

代码实现

逆置

因为数组存放的元素顺序与我们计算的顺序是相反的,在竖式计算中我们是将其右对齐(个位对个位,十位对十位,以此类推),而读取数字后的两个数组是左对齐的,因此我们要将里面的元素逆置

//参数:需要逆置的数组,数组长度
void invertElem(char s[], unsigned long n)
{unsigned long len = n - 1;for (int i = 0, j = len; i < j; i++, j--){char temp = s[i];s[i] = s[j];s[j] = temp;}}

转换

为了方便计算和进位,我们需要将字符型的数字转化成实际数字

注意:这里的转换不是类型转换,例如字符类型8,我们要让它自减48,转化成ASCII码为8的对应的字符,存放元素的数组的类型并没有改变

转换必须在逆置之后。如果转换在前逆置在后,则逆置时分不清末尾的0是数字的一部分还是结束符转换后的数字

//参数:数组,长度
void charInt(char s[], unsigned long n)
{for (int i = 0; i < n; i++)s[i] -= 48;
}

相加

有了以上两个函数之后,我们就可以进行相加了,这里不多说,分析都在注释里,所以直接上代码

int main()
{while (1){char a[1024];char b[1024];char c[2049];//这里必须将每一个元素都置为0,否则位数不同的数字相加时会乱掉memset(a, 0, sizeof(a));memset(b, 0, sizeof(b));memset(c, 0, sizeof(c));scanf("%s", a);scanf("%s", b);//长度获取要在转换之前unsigned long len_a = strlen(a);unsigned long len_b = strlen(b);unsigned long max_len = len_a > len_b ? len_a : len_b;//逆置invertElem(a, len_a);invertElem(b, len_b);//转换charInt(a, len_a);charInt(b, len_b);int carry = 0; //进位//相加,核心步骤//这里的i必须能取到max_len,最高位计算式可能会向前进一位//比如99+1,原本最多两位,相加后得到了一个三位数for (int i = 0; i <= max_len; i++){c[i] = (carry + a[i] + b[i]) % 10;carry = (carry + a[i] + b[i]) / 10;}int i;//寻找第一个不为0的数字或全是0的情况况下找到最后一个0//这是为了防止00+0之类的特殊情况,在这种情况发生时确保只输出一个0for (i = max_len; i >= 1 && c[i] == 0; i--);for (; i >= 0; i--)printf("%d", c[i]);printf("\n");}return 0;
}

完整代码

#include <iostream>
#include <string.h>
#include <math.h>using namespace std;
//参数:需要逆置的数组,数组长度
void invertElem(char s[], unsigned long n)
{unsigned long len = n - 1;for (int i = 0, j = len; i < j; i++, j--){char temp = s[i];s[i] = s[j];s[j] = temp;}}void charInt(char s[], unsigned long n)
{for (int i = 0; i < n; i++)s[i] -= 48;
}int main()
{while (1){char a[1024];char b[1024];char c[2049];//这里必须将每一个元素都置为0,否则位数不同的数字相加时会乱掉memset(a, 0, sizeof(a));memset(b, 0, sizeof(b));memset(c, 0, sizeof(c));scanf("%s", a);scanf("%s", b);//长度获取要在转换之前unsigned long len_a = strlen(a);unsigned long len_b = strlen(b);unsigned long max_len = len_a > len_b ? len_a : len_b;//逆置invertElem(a, len_a);invertElem(b, len_b);//转换charInt(a, len_a);charInt(b, len_b);int carry = 0; //进位//相加,核心步骤//这里的i必须能取到max_len,最高位计算式可能会向前进一位//比如99+1,原本最多两位,相加后得到了一个三位数for (int i = 0; i <= max_len; i++){c[i] = (carry + a[i] + b[i]) % 10;carry = (carry + a[i] + b[i]) / 10;}int i;//寻找第一个不为0的数字或全是0的情况况下找到最后一个0//这是为了防止00+0之类的特殊情况,在这种情况发生时确保只输出一个0for (i = max_len; i >= 1 && c[i] == 0; i--);for (; i >= 0; i--)printf("%d", c[i]);printf("\n");}return 0;
}

高精度加法(C++实现)相关推荐

  1. 基础练习 高精度加法

    基础练习 高精度加法 时间限制:1.0s 内存限制:512.0MB 问题描述 输入两个整数a和b,输出这两个整数的和.a和b都不超过100位. 算法描述 由于a和b都比较大,所以不能直接使用语言中的标 ...

  2. 用C++的类重载高精度加法,乘法和等于符号

    运行结果: 代码如下: #include<iostream> #include<algorithm> #include<string.h> #include< ...

  3. PAT甲级1024 Palindromic Number:[C++题解]回文串和高精度加法

    文章目录 题目分析 题目链接 题目分析 一个判断是否是回文数的函数:check,思路是使用双指针从两端分别往里走. 另一个是高精度加法函数add,传入两个vector. 另外,vector逆序构造可以 ...

  4. PAT甲级1023 Have Fun with Numbers:[C++题解]高精度加法和两个vector大小比较

    文章目录 题目分析 题目链接 题目分析 使用高精度加法高精度加法板子求 这个数的两倍,存在一个vector中. 所谓高精度就是使用string来存大的数,然后模拟列竖式加法,结果一位一位压入数组vec ...

  5. 《信息学奥赛一本通》 高精度加法。输入两个正整数,求它们的和。

    高精度加法.输入两个正整数,求它们的和. 算法分析 升级版代码 算法分析 输入两个数到两个变量中,然后用赋值语句求它们的和,输出.但是,我们知道,在C++语言中任何数据类型都有一定的表示范围.当两个被 ...

  6. 高精度加法(非负)和大数阶乘及和汽水问题

    高精度加法(非负)和大数阶乘 文章目录 高精度加法(非负)和大数阶乘 一.问题描述 二.代码 三.问题描述 四.代码 五.问题描述 六.代码 一.问题描述 二.代码 #define _CRT_SECU ...

  7. 高精度加法(A+BProblemII)

    好久没有写文章了,主要是近期开学上网课再加上刷题的缘故,日常有些忙碌. 话不多说,接下来是正题: 一切问题都是有源头的,在这里我就直接先放题了. 接下来我以代码+部分代码的解释+注意事项进行 ps:( ...

  8. CCF NOI1138 高精度加法

    问题链接:CCF NOI1138 高精度加法. 时间限制: 1000 ms  空间限制: 262144 KB 题目描述 给两个正整数,计算它们的和. 输入 两行,每行表示一个数(位数达10000位). ...

  9. 高精度加法 problem A+B

    题目描述 高精度加法,相当于 a+b problem,不用考虑负数. 输入格式 分两行输入.a,b <=10^500 输出格式 输出只有一行,代表 a+b 的值. 输入输出样例 输入 1001 ...

最新文章

  1. 理解并解决IE的内存泄漏方式[翻译2]
  2. Visual Studio Code之常备快捷键
  3. Memcached与Redis
  4. [2dPIC调试笔记]输入参数归一化1014(1)
  5. 数据库原理学习笔记(一)关系完整性以及数据库完整性
  6. 根据年 -月查询这个月的第一天和最后一天
  7. 什么是 Web 应用性能评测领域的 RAIL 模型
  8. AtCoder Grand Contest #026 D - Histogram Coloring
  9. 2017.8.23创业项目方向
  10. 如何在Windows 10中将您喜欢的设置固定到开始菜单
  11. encoding/json 方法Marshal的说明
  12. 星爷001正式开始写blog啦
  13. python == 字符编码
  14. [原创]java WEB学习笔记103:Spring学习---Spring Bean配置:基于注解的方式(基于注解配置bean,基于注解来装配bean的属性)...
  15. php读取excel怎么读取sheet2,PHP读取Excel 之 Spreadsheet_Excel_Reader
  16. A品牌电动车全国营销方案
  17. 只有VOB 文件,怎样使用IfoEdit生成烧制DVD所需的IFO、BUP文件!
  18. 聂易铭:3月20日数字货币筑底失败,破位遥遥无期
  19. Java Ftp客户端
  20. 真实IP收集及其利用方式

热门文章

  1. YOLOv3中Loss
  2. C malloc 用法
  3. elasticsearch 写入数据并查询
  4. tensorflow就该这么学--3
  5. 对比几个数据概念,数据仓库、数据集市、数据湖、数据中台分别是什么?到底有什么区别?都得做吗?
  6. 数学在机器学习中的作用
  7. Hadoop学习之MapReduce(三)
  8. Ubuntu基础知识
  9. 连环清洁工之特殊任务--java资源如何关闭?
  10. 字符编码的前世今生--转