大家都知道c++里整数是分为四种类型的,short,int,long和long long,short的范围是最小的,long long 的范围是最大的。
在整数范围内做运算是非常方便的,但是一旦超过设定的范围,c++就需要使用高精度来做运算了,那具体怎么写呢?
我们需要定义两个范围比较大的字符数组用来存储大数,那为什么要用字符数组存储呢?因为大数已经超出整数的范围了,又需要连续输入,所以只能用字符数组进行存储。
那先来看下高精度加法运算需要哪些头文件:
#include<iostream>
#include<cstring>
或者大家也可以直接导入万能头:
#include<bits/stdc++.h>
接下来定义数据容器,字符数组和一维数组,字符数组用来存储大数,一维数组用来存储大数的各个位数以及最后的结果。
char s1[505],s2[505];
int a[505],b[505],c[505];
输入两个大数并求出长度后 就可以开始依次遍历字符元素将其转为数字并倒置存储到一维数组里了。
(字符型减字符0就是其int值)
int len1=0,len2=0;
scanf("%s",s1);
scanf("%s",s2);
len1=strlen(s1);
len2=strlen(s2);
for(int i=0;i<len1;i++){
a[len1-i]=s1[i]-'0';
}
for(int i=0;i<len2;i++){
b[len2-i]=s2[i]-'0';
}
因为大数相加可能会涉及到进位,所以我们需要找到这两个数的最大长度并且将该长度加1。
int lenmax=max(len1,len2)+1;
现在我们已经将两个大数存储到一维数组里了,下一步就该相加(进位)了。
(因为是倒置存储,所以如果涉及到进位,我们需要将商存储到下一位置。)
for(int i=1;i<=lenmax;i++){
c[i]=a[i]+b[i];//之所以加c[i]是因为下一步的进位可以算进去
c[i+1]=c[i]/10;//整除10,可以表示进位
c[i]=c[i]%10;//把进位的部分去掉,留下个位数
}
有的题目中可能会将大数前置0,所以我们运算后是需要去除0的,这样我们的程序才会更加严谨。
while(c[lenmax]==0 &&lenmax>0) lenmax--;
到这一步我们已经运算好了,就可以进行结果输出了。
(因为是逆序运算,所以我们输出结果的时候也需要逆序)
for(int i=lenmax;i>0;i--){
cout<<c[i];
}
以下是高精度加法运算的全部代码。
#include<iostream>
#include<cstring>
using namespace std;
char s1[505],s2[505];
int a[505],b[505],c[505];
int main(){
int len1=0,len2=0;
scanf("%s",s1);
scanf("%s",s2);
len1=strlen(s1);
len2=strlen(s2);
for(int i=0;i<len1;i++){
a[len1-i]=s1[i]-'0';
}
for(int i=0;i<len2;i++){
b[len2-i]=s2[i]-'0';
}
int lenmax=max(len1,len2)+1;
for(int i=1;i<=lenmax;i++){
c[i]+=a[i]+b[i];
c[i+1]=c[i]/10;
c[i]=c[i]%10;
}
while(c[lenmax]==0 &&lenmax>0) lenmax--;
for(int i=lenmax;i>0;i--){
cout<<c[i];
}
return 0;
}