第十一章:高精度算法

本文介绍了高精度算法,包括高精度加法、减法、乘法和除法。通过例题详细阐述了每个操作的解题步骤和关键点,并提供了相关主题库的题目和解题思路。高精度算法主要通过字符串或数组存储超大整数,模拟传统运算过程来实现计算。
摘要由CSDN通过智能技术生成

高精度算法

高精度加法

例题1:高精度加法1157

题目描述

计算两个非负整数之和

输入输出格式

输入

从键盘上输入两个非负整数,每个数占一行,每个数的位数不超过240.

输出

输出只有一行为两个数之和。

样例

输入1

12
13

Copy

输出1

25

Copy

时间及空间限制

1s, 256MB.

解题分析:

很明显在题目中提到了每个数的位数不超过240,显然题目的输出结果肯定会超出了unsigned long long的取值范围。因此简单的将两个超大数加起来是行不通的,实际生活例如这样的例子有很多,那么如何解决两个超大数相加的问题呢?我相信很多同学都会想到利用字符串去实现,实际上我们的确是运用字符串的方法,那么具体又该如何利用字符串的知识去实现两个超大数的相加问题呢?这就是本节课的重点。

用字符串来模拟非常长的整数,这意味着可以用字符数组的每位记录那个数字上的每一位。

解决了存储问题之后,再来回顾一下竖式加法:

整式加法的实质就是模拟每一位的加法与进位,对于十进制加法来说,某-位上的和超过9附会产生进位现象,进位就是保留那处数字的个位数, 然后把十位上的数字加给下一位去, 详见下图:

思考:假设正整数A的长度为n,正整数B的长度为m,那么A+B的长度最大为多少?最小为多少?

答∶ ①max(n,m)+ 1; ②max(n,m);


高精度加法的解题步骤:

①高精度数的读取与存储∶使用字符串方式读取,然后转换为整数,逆向存储到整型数组

②高精度数的加法∶通过数组下标模拟两个加数中每一个位上数的加法


③去除前导0后,逆向输出。


完整代码如下:

#include<bits/stdc++.h>
using namespace std;
int c[1005],d[1005],e[1005];
//c,d分别存2个加数,e存和 
int main()
{
  //1--把2个加数存放到字符串中,再倒置到int 数组中(c,d) 
  string a,b;
  cin>>a>>b;
  int cxb=1,dxb=1,len1=a.size(),len2=b.size();
  for(int i=len1-1;i>=0;i--)
  {
    c[cxb]=a[i]-48;//a[i]-'0'
    cxb++;
  }
  for(int i=len2-1;i>=0;i--)
  {
    d[dxb]=b[i]-48;
    dxb++;
  }
  //2--确定一下和的终点下标
  int zd=max(len1,len2)+1;
  //3--进行逐位的求和
  for(int i=1;i<=zd;i++)
  {
     int t=c[i]+d[i];
     e[i]+=t;
     e[i+1]+=e[i]/10;
     e[i]%=10;
  } 
  //4--讨论终点下标
  if(e[zd]==0)  zd--;
  //5--逆序输出e数组
  for(int i=zd;i>=1;i--)
  {
    cout<<e[i];
  } 
}

Copy

例题2:A+B Problem(主题库2607)

题目描述

高精度加法。输入两个正整数,求它们的和。

输入输出格式

输入

输入两行,每行为一个高精度整数(非负数,长度不超过255)。

输出

输出一行,相加的结果。

样例

输入

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值