从零开始的算法学习生活——①高精度运算
Posted 我带你们打代码
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从零开始的算法学习生活——①高精度运算相关的知识,希望对你有一定的参考价值。
文章目录
前言
在摸了这么久鱼后,本蒟蒻也下定决心要开始好好学习算法了!从这第一篇博客开始,从零开始记录我的算法学习生活,权当是给自己做做笔记,文章或许有错误疏漏的地方,还请多多包容!
一、怎样实现高精度运算?
我们在平时存储一个整数时,通常使用int类型来储存,而一个四字节的int最多也只能储存到2^31-1 = 2,147,483,647不过十位而已。数字稍微大一点时,还可以使用long long类型。而需要存储或者使用更大的整数时,就需要利用数组来模拟非常长的整数。
二、例题
P1601 A+B Problem(高精)
题目描述
高精度加法,相当于a+b problem,不用考虑负数.
输入格式
分两行输入。数据范围:
a
,
b
≤
1
0
500
a,b\\le 10^500
a,b≤10500
输出格式
输出只有一行,代表
a
+
b
a+b
a+b 的值
输入输出样例
输入 #
1
1
1
1
1
1
1
1
1
输出 #
1
1
1
2
2
2
输入 #
2
2
2
1001
1001
1001
9099
9099
9099
输出 #
2
2
2
10100
10100
10100
1.分析
题面没啥好说的,一个A+B problem的高精度版本。
该题目需要储存500位大的非负整数,一般的存储方法显然是行不通的,这里就要利用数组来进行模拟存储。
那么要如何实现两个大数的加法呢?类似于竖式加法,从低位至高位,模拟每一位的加法与进位。对于十进制加法,当某一位加和大于9时将产生进位,所以要从低位至高位依次判断是否要向前进位。
举个例子,539+658=1197,下表是每一位的运算过程。
数 | 第3位 | 第2位 | 第1位 | 第0位 |
---|---|---|---|---|
a | 5 | 3 | 9 | |
b | 6 | 5 | 8 | |
中间运算结果 | 11 | 8 | 17 | |
处理进位1 | 11 | 9 | 7 | |
处理进位2 | 1 | 1 | 9 | 7 |
结果 | 1 | 1 | 9 | 7 |
同时这里也可以看出,必须从低位至高位运算,否则可能会产生顺序上的错误,只有处理了低位的进位,才能知道高位是否需要进位。
2.AC代码
附上AC代码
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const int max_n = 502;//最大位数
int a[max_n],b[max_n],c[max_n];
int main()
string A,B;
cin>>A>>B;
int len = max(A.length(),B.length());
for (int i = 0,j = A.length()-1; j>=0; i++,j--)
a[i] = A[j] - '0';
for (int i = 0,j = B.length()-1; j>=0; i++,j--)
b[i] = B[j] - '0';
for (int i = 0; i<len ; i++ ) //从低位至高位依次作加法运算
c[i]+= a[i]+b[i];//当前位相加
c[i+1] = c[i]/10;//若当前位大于十,则向前进位
c[i]%=10;//保留个位数
if(c[len])len++;//若最高位产生进位,则长度可能发生改变
while(len--)cout<<c[len];
return 0;
总结
高精度整数加法通过数组进行模拟大数的存储,加法实质上是模拟每一位的加法与进位,保留当前位的个位,将十位(如果有)加到下一位。
第一篇博客就到这里结束啦,题目比较简单基础,但没有良好的基础打地基,所有以后的学习不过是空中楼阁罢了。新的一年新的开始,一步一个脚印向前进发吧!
以上是关于从零开始的算法学习生活——①高精度运算的主要内容,如果未能解决你的问题,请参考以下文章