高精度加法

简介

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

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

步骤

以下有顺序之分

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

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

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

代码实现

逆置

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

//参数:需要逆置的数组,数组长度
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++实现)的更多相关文章

  1. NEFU 2016省赛演练一 F题 (高精度加法)

    Function1 Problem:F Time Limit:1000ms Memory Limit:65535K Description You know that huicpc0838 has b ...

  2. java算法 蓝桥杯 高精度加法

    问题描述 在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263.要想计算更加规模的数,就要用软件来扩展了,比如用数组或 ...

  3. 用c++实现高精度加法

    c++实习高精度加法 最近遇到一个c++实现高精度加法的问题,高精度问题往往十复杂但发现其中的规律后发现并没有那么复杂,这里我实现了一个整数的高精度加法,主要需要注意以下几点: 1:将所需输入的数据以 ...

  4. 高精度加法——经典题 洛谷p1601

    题目背景 无 题目描述 高精度加法,x相当于a+b problem,[b][color=red]不用考虑负数[/color][/b] 输入输出格式 输入格式: 分两行输入a,b<=10^500 ...

  5. 高精度加法--C++

    高精度加法--C++ 仿照竖式加法,在第一步计算的时候将进位保留,第一步计算完再处理进位.(见代码注释) 和乘法是类似的. #include <iostream> #include < ...

  6. 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) ...

  7. POJ 3181 Dollar Dayz(全然背包+简单高精度加法)

    POJ 3181 Dollar Dayz(全然背包+简单高精度加法) id=3181">http://poj.org/problem?id=3181 题意: 给你K种硬币,每种硬币各自 ...

  8. leetcode 67. Add Binary (高精度加法)

    Given two binary strings, return their sum (also a binary string). For example,a = "11"b = ...

  9. leetcode 66. Plus One(高精度加法)

    Given a non-negative number represented as an array of digits, plus one to the number. The digits ar ...

  10. SCAU1143 多少个Fibonacci数--大菲波数【杭电-HDOJ-1715】--高精度加法--Fibonacci数---大数比较

    /*******对读者说(哈哈如果有人看的话23333)哈哈大杰是华农的19级软件工程新手,才疏学浅但是秉着校科联的那句“主动才会有故事”还是大胆的做了一下建一个卑微博客的尝试,想法自己之后学到东西都 ...

随机推荐

  1. ZYNQ 启动问题 :FSBL

    0.ZYNQ外部启动条件 1. 电源要求: 在阶段0 BootROM时,安全模式下PS与PL都是必须上电的:非安全模式PS需要上电,如图: 在阶段1 FSBL时,PS与PL都是必须上电的,因为PL将在 ...

  2. meterpreter中使用mimikatz获取windows密码

    进去meterpreter后getuid一下 这获得系统管理员权限 开始 加载mimikatz模块 load mimikatz 加载成功. 第一种方法: 获取登录密码的hash值 msv 上面已经是得 ...

  3. struts-032利用工具 PythonGUI

    # -*- coding: utf-8 -*- import requests from Tkinter import * class App: def __init__(self, master): ...

  4. JVM | 第1部分:自动内存管理与性能调优《深入理解 Java 虚拟机》

    目录 前言 1. 自动内存管理 1.1 JVM运行时数据区 1.2 Java 内存结构 1.3 HotSpot 虚拟机创建对象 1.4 HotSpot 虚拟机的对象内存布局 1.5 访问对象 2. 垃 ...

  5. .Net core Api后台获取数据,异步方法中,数据需采用Linq分页

    .net core api using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressi ...

  6. CF 920A Water The Garden

    本题可以看做是一个数学题 因为 在第 1 和第 3 个洒水器之间的 花园灌溉的时间只要 (1 + 3 ) >> 1 - 1 + 1;//这么长的时间 那么我么就可以以此类推到 从而我么可以 ...

  7. 数据库篇:mysql锁详解

    前言 sql事务的执行,如果需要锁定数据进行更新操作,则必定离不开锁 共享锁和排他锁 表锁 行锁 Record Lock 间隙锁 Gap Lock 行锁+间隙锁 Next-Key Lock 加锁场景( ...

  8. python-binasscii模块学习

    作用 binascii模块包含很多在二进制和ASCII编码的二进制表示转换的方法.通常情况不会直接使用这些功能,而是使用像UU,base64编码,或BinHex封装模块. binascii模块包含更高 ...

  9. 对原型链的理解?prototype上都有哪些属性?

    在js里,继承机制是原型继承.继承的起点是 对象的原型(Object prototype). 一切皆为对象,只要是对象,就会有 proto 属性,该属性存储了指向其构造的指针. Object prot ...

  10. 基于Vue实现关键词实时搜索高亮显示关键词

    最近在做移动real-time-search于实时搜索和关键词高亮显示的功能,通过博客的方式总结一下,同时希望能够帮助到别人~~~ 如果不喜欢看文字的朋友我写了一个demo方便已经上传到了github ...