C++高精度加法
Posted 和球球一起学编程
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++高精度加法相关的知识,希望对你有一定的参考价值。
我们知道,计算机有一个显著的特点就是运算速度快,运算精度高。尤其是在处理比较大的数据时,计算机的优势就更加明显。截止到2019年12月15日,中国最快的计算机是“天河一号”。那么计算机是如何进行运算的呢?
例:用C++语言编写一个求两个数的和的程序。
程序:
using namespace std;
int main(){
int a,b;
cin>>a>>b;//输入a,b两数
cout<<a+b;//输出a,b的和
return 0;
}
求两个数的和,用C++语言很容易编写。C++中现有的整数数据类型有int和long long型,我们知道int型整数最大能到10的9次方,也就是10位数,而long long型整数最大能到10的19次方,也就是20位数。那么问题来了,如果a、b的位数比较多呢?比如:a、b两数是100位的整数或者1000位的整数,这时它们的和如何计算呢?这就是我们今天要说的高精度加法。
例:现有两个10000位的正整数,要求将它们加起来输出。
分析:
(1)高精度加法,所用到的算法很简单,其实就是我们小学所学的加法“竖式”计算。将两个加数的对应数位对齐,也就是说个位对个位、十位对十位、百位对百位,对应的数位进行加法操作,有进位的要进位。
(2)高精度加法要将两个加数按对应的位数一位一位地处理,所以在实践中,将两个加数分别用两个数组进行存储,问题就会变得简单。
(3)之前我们已经说过,C++中最大的整数是long long型,最大位数是20位。所以对于10000位的正整数,我们输入的数据类型应该是一个字符串,也就是string型的数据。
程序代码如下:
//如:遍历(for_each)、查找(find)、二分查找(binary_search、lower_bound、upper_bound)
// 去除重复(unique)、填充(fill)、前一个排列(pre_permutation)、下一个排列(next_permutation)、排序(sort)等
using namespace std;
const int MAXN=10005;
int A[MAXN],B[MAXN],C[MAXN],Ans[MAXN],Len_A,Len_B,Len_Ans;
void Read(int *A,int &Len){//int *A 定义一个整型的变量指针 ,可看作一个整数型的数组
string s;
cin>>s;
Len=s.length();
for(int i=0;i<Len;i++){
A[i]=s[i]-48;//A[i]=s[i]-'0';将字符转换成对应的数字
}
reverse(A,A+Len);//对A[0]…A[Len-1]进行翻转 ,逆序
} //输入函数,将输入的字符串转换成对应的数字组成的数组,并将数组逆序,即个位放到第一位,方便计算
int main(){
Read(A,Len_A);//输入第一个加数
Read(B,Len_B);//输入第二个加数
Len_Ans=max(Len_A,Len_B);// 两数和的位数取这两个加数中位数多的那个数的值
memset(C,0,sizeof(C));//初始化控制进位的数组C ,初始值均为0,当发生进位时,对应的数位的值变成1
for(int i=0;i<=Len_Ans;i++){//因为可能有进位,所以要运算到比数组的元素个数加1
Ans[i]=A[i]+B[i]+C[i];//加上前一位的进位值
if(Ans[i]>=10) {
C[i+1]=(Ans[i])/10;//处理进位 也可直接用 C[i+1]=1;
Ans[i]%=10;//进位之后原数位上的数 也可用 Ans[i]-=10;
}
}
if(Ans[Len_Ans]>0) Len_Ans++;//最后一次如果有进位,则位数加1 ,两个10000位的数相加,和有可能是10001位
//while(Ans[Len_Ans]>0) Len_Ans++;
for(int i=Len_Ans-1;i>=0;i--){
cout<<Ans[i];
}//将得到的数组逆序输出就是我们求的和 也可先将数组翻转,然后正序输出
return 0;
}
以上就是高精度加法运算。在之后的学习中我们将继续讲解高精度减法、高精度乘法、高精度除法运算。
欢迎加入知识星球:球球小课堂 获取arduino相关程序源代码
(球球自己经营的知识星球,会不定时地分享其学习成果)
关注视频号:杨老师编程小课堂,欣赏更多arduino小作品
以上是关于C++高精度加法的主要内容,如果未能解决你的问题,请参考以下文章