首页 > 编程语言 >高精度算法-加法(附完整源码)

高精度算法-加法(附完整源码)

时间:2023-03-06 19:47:34浏览次数:45  
标签:src 高精度 int s2 s1 源码 加法 101 size

前言:基础的加法,类似a+b都很熟悉,但是整型之间的加法是存在范围限制的,比如int类型的范围是【-231,+231-1】,即使是long long类型也有着【-263,+263-1】的范围,一旦超过这个范围,计算机无法准确给出答案。计算这类问题就是高精度算法的意义

0.整型转字符(准备工作)

数组中可以储存许多数字,并且没有限制,比如1亿只需要向数组中储存9位数字,所以我们高精度算法的核心就是将超出长整型范围的数字分成个,十,百......分别作为元素储存在数组当中。

#include <iostream>
using namespace std;
string s1,s2;//储存高精度加法两个数字的字符串数组
int a[101],b[101],c[101];//这里马上讲到

1.个位对齐-反转,字符转整型

这里是一个小难点,我举个小例子
假如是s1="123" ,s2="34"
image
先不论字符串能不能直接加(一会儿会转化为整型的),我们看到这个计算方式错的很低级,但是我们就是用字符串对应位相加,然后拼在一起。所以出现这个问题,也就是同一位(即个位和个位,十位和十位)没有对齐,为了方便解决这个问题,我们将字符串中数字反转,呈现下图的样子
image
其实这基本上就是这种题目的完整思路了,不过后面要完善一下细节,我们接下来写一下反转的代码

void strtoint(string src,int des[]){//这里用到上面的a[101],b[101],c[101],作为参数传进来。
    for (int i = 0; i < src.size(); ++i) {
        des[src.size()-i]=src[i]-'0';//这一步是转换为整型。我们这里des数组初始就不从0开始了,从1开始,为了后面方便计算。
    }
}

2.计算c数组长度

这个比较好理解,两数相加得到的数字位数要不然等于位数大的,要不然进一位成位数大的加一位,自己举几个例子看看就行,123+34=157,990+11=1001,不外乎这两个情况,直接上代码

cin>>s1>>s2;
strtoint(s1,a);
strtoint(s2,b);
int la=s1.size(),lb=s2.size();
int lc=max(la,lb)+1;

3.对位相加得出c数组

for (int i = 1; i <=lc ; ++i) {
        c[i]=a[i]+b[i]+c[i];
        c[i+1]=c[i]/10;
        c[i]=c[i]%10;
    }

代码已上,详细解释下
image

4.去除前导0

我们是倒序输出c数组元素的,直接输出会出现一些问题,比如
image

image
因为之前的操作,c数组长度可能多一位,倒着会输出未赋值的元素即0,因此要消除这个前导0,同时因为第二种情况的出现,我们需要多次消除这个0,直到非零元素或只剩一个0元素。

while (c[lc]==0&&lc>1) lc--;

这就是完整思路了,写这么一篇好累啊,最后附上完整代码

#include <iostream>
using namespace std;
string s1,s2;
int a[101],b[101],c[101];
void strtoint(string src,int des[]){
    for (int i = 0; i < src.size(); ++i) {
        des[src.size()-i]=src[i]-'0';
    }
}
int main(){
    cin>>s1>>s2;
    strtoint(s1,a);
    strtoint(s2,b);
    int la=s1.size(),lb=s2.size();
    int lc=max(la,lb)+1;
    for (int i = 1; i <=lc ; ++i) {
        c[i]=a[i]+b[i]+c[i];
        c[i+1]=c[i]/10;
        c[i]=c[i]%10;
    }
    while (c[lc]==0&&lc>1) lc--;
    for (int i = lc; i >=1 ; --i) {
        cout<<c[i];
    }
    return 0;
}

标签:src,高精度,int,s2,s1,源码,加法,101,size
From: https://www.cnblogs.com/nobodyx/p/17184531.html

相关文章

  • jQuery实现省级联动效果——源码
    一、效果图二、index.html<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>jQuery实现省级联动</title></head><body><div><select......
  • JobSchedulingData源码
    //------------------------------------------------------------------------------//<auto-generated>//Thiscodewasgeneratedbyatool.//RuntimeV......
  • 从源码MessageSource的三个实现出发实战spring·i18n国际化
    1.前言互联网业务出海,将已有的业务​​CopytoGlobal​​,并且开始对各个国家精细化,本土化的运营。对于开发人员来说,国际化很重要,在实际项目中所要承担的职责是按照客户指定......
  • 云HIS源码 Java二甲医院HIS系统 融合B/S版电子病历系统,支持电子病历四级
    一、云HIS系统综合概述一款满足二甲医院、基层医疗机构各类业务需要的健康云产品。该产品能帮助基层医疗机构完成日常各类业务,提供病患挂号支持、病患问诊、电子病历、开药......
  • 大白话+画图 从源码角度一步步搞懂ArrayList和LinkedList的使用
    1.说说ArrayList1.基本原理ArrayList,原理就是底层基于数组来实现。01.基本原理:数组的长度是固定的,java里面数组都是定长数组,比如数组大小设置为100,此时你不停的往Arra......
  • 第三方模块源码下载安装步骤讲解
    第一步:在Gitee上clone下来第二步:在本机下载目录找下载好了的源码文件第三步:装完之后,首先把路径复制下来第四步:之后来到项目,在terminal里面先CD到C盘,再把刚刚复制的......
  • CentOS 升级内核的三种方式(yum/rpm/源码)
    CentOS升级内核的三种方式(yum/rpm/源码)在CentOS使用过程中,难免需要升级内核,但有时候因为源码编译依赖问题,不一定所有程序都支持最新内核版本,所以以下将介绍三种升级内......
  • 基层医院云HIS源码
    云HIS系统全新技术框架:总体框架:SaaS应用,全浏览器访问前后端分离,多服务协同服务可拆分,功能易扩展云HIS系统技术细节:前端:Angular+Nginx后台:Java+Spring,SpringBoot,Spring......
  • HashSet 源码解读
    1.创建HashSetSet<String>set=newHashSet<>();set.add("aaa");2.构造方法privatetransientHashMap<E,Object>map;/***Constructsanew,emptyset;......
  • LinkedList 源码解读
    1.创建 LinkedListList<String>list=newLinkedList<>();list.add("wang");2.构造方法:开起了什么都没有做/***Constructsanemptylist.*/......