最近因为课程拉下太多,然后再狂补C++的课程,在写洛谷的题的时候碰到了一个只是盲区:高精度运算
因为计算机识别的最长的数据类型为long long类型,数据长度为-2^62到2^62-1之间,换算为十进制就是-9223372036854775808到9223372036854775807,数据长度仅仅为19位,但是当数据长度很长的时候计算机就不能对数据进行识别,这时候数据的运算就成问题,此时应该使用高精度算法对数据进行处理。
题目来源于洛谷p1009阶乘之和:
此处需要用到高精度加法运算,但是当初我使用的仅仅是普通long long运算,最后的结果仅仅是两个AC
后来经过学习得知,高精度加法运算需要将数字以字符串的形式存储在数组中进行运算,用数组的相对应的数位进行加法运算,在相对应的数位进行进位跟本位的转换,从而实现超长数位的加法运算
高精度加法代码附上:
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200+4; //根据题目的最大值。+4为了防止A+B出现进位
char s1[MAXN] = {};//存储字符串
char s2[MAXN] = {};//存储字符串
int a[MAXN] = {};//存储加数A
int b[MAXN] = {};//存储加数B
int c[MAXN] = {};//存储和B
int main()
{
scanf("%s %s", s1, s2);//读入字符串A
//将字符串写入到数组A中
int len1 = strlen(s1);
for (int i=0; i<len1; i++)
{
//倒序写入
a[i] = s1[len1-i-1] - '0';
}
//将字符串写入到数组A中
int len2 = strlen(s2);
for (int i=0; i<len2; i++)
{
//倒序写入
b[i] = s2[len2-i-1] - '0';
}
//模拟竖式加法
int jw=0;//进位
int len = max(len1, len2)+1;//注意因为最高位可能出现进位
for (int i=0; i<len; i++)
{
c[i] = a[i] + b[i] + jw;//当前加数A位数据+加数B位位数据+上一位的进位
jw = c[i] / 10;//本次加法是否存在进位
c[i] %= 10;//只能保存 0 ~ 9 的数据
}
//删除前导零
for (int i=len-1; i>=0; i--)
{
//因为我们是从索引 0 开始,所以最高位是保存在 len-1
if (0==c[i] && len>1)
{
//注意要有 len>1 这个条件。考虑特殊情况,加法结果为 00,我们实际要输出 0。
len--;
}
else
{
//第一个不是零的最高位,结束删除
break;
}
}
//逆序打印输出
for (int i=len-1; i>=0; i--)
{
printf("%d", c[i]);
}
printf("\n");
return 0;
}