高精度算法
高精度加法
例题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)。
输出
输出一行,相加的结果。
样例
输