高精度加法(C++实现)
高精度加法
简介
用于计算含有超过一般变量存放不下的非负整数
高精度加法这个过程是模拟的小学竖式加法计算
步骤
以下有顺序之分
- 数组清零
- 输入
- 获取长度
- 逆置
- 字符型数字转成对应的整型数字
- 计算并输出
简单来看重要的步骤也就以下几步
- 清零
- 逆置
- 转换
- 相加计算(包含进位)
代码实现
逆置
因为数组存放的元素顺序与我们计算的顺序是相反的,在竖式计算中我们是将其右对齐(个位对个位,十位对十位,以此类推),而读取数字后的两个数组是左对齐的,因此我们要将里面的元素逆置
//参数:需要逆置的数组,数组长度
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之类的特殊情况,在这种情况发生时确保只输出一个0
for (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之类的特殊情况,在这种情况发生时确保只输出一个0
for (i = max_len; i >= 1 && c[i] == 0; i--);
for (; i >= 0; i--)
printf("%d", c[i]);
printf("\n");
}
return 0;
}
高精度加法(C++实现)的更多相关文章
- NEFU 2016省赛演练一 F题 (高精度加法)
Function1 Problem:F Time Limit:1000ms Memory Limit:65535K Description You know that huicpc0838 has b ...
- java算法 蓝桥杯 高精度加法
问题描述 在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263.要想计算更加规模的数,就要用软件来扩展了,比如用数组或 ...
- 用c++实现高精度加法
c++实习高精度加法 最近遇到一个c++实现高精度加法的问题,高精度问题往往十复杂但发现其中的规律后发现并没有那么复杂,这里我实现了一个整数的高精度加法,主要需要注意以下几点: 1:将所需输入的数据以 ...
- 高精度加法——经典题 洛谷p1601
题目背景 无 题目描述 高精度加法,x相当于a+b problem,[b][color=red]不用考虑负数[/color][/b] 输入输出格式 输入格式: 分两行输入a,b<=10^500 ...
- 高精度加法--C++
高精度加法--C++ 仿照竖式加法,在第一步计算的时候将进位保留,第一步计算完再处理进位.(见代码注释) 和乘法是类似的. #include <iostream> #include < ...
- hdu1002 A + B Problem II(高精度加法) 2016-05-19 12:00 106人阅读 评论(0) 收藏
A + B Problem II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- POJ 3181 Dollar Dayz(全然背包+简单高精度加法)
POJ 3181 Dollar Dayz(全然背包+简单高精度加法) id=3181">http://poj.org/problem?id=3181 题意: 给你K种硬币,每种硬币各自 ...
- leetcode 67. Add Binary (高精度加法)
Given two binary strings, return their sum (also a binary string). For example,a = "11"b = ...
- leetcode 66. Plus One(高精度加法)
Given a non-negative number represented as an array of digits, plus one to the number. The digits ar ...
- SCAU1143 多少个Fibonacci数--大菲波数【杭电-HDOJ-1715】--高精度加法--Fibonacci数---大数比较
/*******对读者说(哈哈如果有人看的话23333)哈哈大杰是华农的19级软件工程新手,才疏学浅但是秉着校科联的那句“主动才会有故事”还是大胆的做了一下建一个卑微博客的尝试,想法自己之后学到东西都 ...
随机推荐
- BBS项目补充知识(后台文章展示功能)
BBS项目补充知识 1. 开放 media 文件路径 # 以用户注册页面为例 用户头像文件我们默认时保存在 根路径下的static下的img文件夹 但也可以单独放置在指定路径下 # 根路径下创建 me ...
- python3输出由1、2、3、4这四个数字组成的每位数都不相同的所有三位数
for i in range(1,5): for j in range(1,5): for k in range(1,5): if(i!=j and i!=k and j!=k): print(i*1 ...
- mycat的基本介绍 看这一篇就够了
1.前置知识 1.分布式系统 分布式系统是指其组件分布在网络上,组件之间通过传递消息进行通信和动作协调的系统.它的核心理念是让多台服务器协同工作,完成单台服务器无法处理的任务,尤其是高并发或者大数 ...
- AFO以后的机房游记
2019.8.6~8.8 周老师让我讲插头DP,理所当然地到机房备课(tuifei) dl24来了足足19个人.只可惜lsy没来,我们的phy,ljx去了首师附.看不到神仙打架了[哭] 插头DP这玩意 ...
- 开发中常用的几种 Content-Type
开发中常用的几种 Content-Type application/x-www-form-urlencoded 浏览器的原生 form 表单,如果不设置,那么最终就会以 application/x-w ...
- SpringBoot 开局篇
SpringBoot SpringBoot 是什么 SpringBoot 是为了简化配置文件开发的一种解决方案 SpringBoot 遵从 规范大于配置 SpringBoot 内置传统 Spring ...
- kafka unclean 配置代表啥,会对 spark streaming 消费有什么影响?
unclean.leader.election.enable 为true的话,意味着非ISR集合的broker 也可以参与选举,这样有可能就会丢数据,spark streaming在消费过程中拿到的 ...
- 如何确保消息正确地发送至 RabbitMQ? 如何确保消息接收方消费了消息?
发送方确认模式 将信道设置成 confirm 模式(发送方确认模式),则所有在信道上发布的消息都 会被指派一个唯一的 ID. 一旦消息被投递到目的队列后,或者消息被写入磁盘后(可持久化的消息),信 道 ...
- Java 中 Semaphore 是什么?
Java 中的 Semaphore 是一种新的同步类,它是一个计数信号.从概念上讲,从 概念上讲,信号量维护了一个许可集合.如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可.每 ...
- mac 添加java_home 和启动es
转:https://www.cnblogs.com/wxmdevelop/p/9935797.html p.p1 { margin: 0; font: 11px Menlo; color: rgba( ...