一.高精度加法
1.概念
高精度:处理位数较大的数学计算方法。
低精度:处理位数较低的数学计算方法。
高精度加法:高精度 + 高精度
2.存储大小的问题
int :100+10^9
“+”号右边部分可以存储到10的9次方。
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int num=100+pow(10,9);
cout<<num;
return 0;
}
输出样例:1000000100
long :10^18
它可以存储到10的18次方。
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
long long num=pow(10,18);
cout<<num;
return 0;
}
输出样例:1000000000000000000
3.进位问题
类似于小学的加法运算,例如11+29
4.补0问题
例如1111+22,程序运算时要补0,例如1111+0022
5.处理进位溢出的问题
例如611+744,相加出来的结果是四位数,这种情况明显是长度不够用了,所以我们需要更新长度,即长度+1。
6.总结
①用数组存储数字:以倒着存的方式进行运算,解决了很多的问题。
例如1234+23 → 1234+0023 → 4321+3200 。
②数组长度+数组 → 可以维护一个高精度大数。
二.代码
题目描述:输入两个高精度大数,进行相加的运算。
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
//存储大整数且输入
char str1[205]={0},str2[205]={0};
int num1[205]={0},num2[205]={0};
cin>>str1>>str2;
//获取字符串长度
int len1=strlen(str1);
int len2=strlen(str2);
//字符串倒序,将每一个数放到整型数组之中
for(int i=1;i<=len1;i++){
num1[i]=str1[len1-i]-'0';
}
for(int i=1;i<=len2;i++){
num2[i]=str2[len2-i]-'0';
}
//获取最大的长度
int len=max(len1,len2);
//低位往高位运算
for(int i=1;i<=len;i++){
num1[i]=num1[i]+num2[i]; //位数相加
num1[i+1]=num1[i+1]+num1[i]/10; //更新进位
num1[i]=num1[i]%10; //保留位数
}
int flag=0;
//倒着遍历
//如果进位溢出,就需要更新长度,即len+1
for(int i=len+1;i>=1;i--){
//处理前导0
if(num1[i]!=0){ //最前面的位数不等于0
flag=1; //标记为1
}
if(flag==1){
cout<<num1[i];
}
}
return 0;
}
输入样例:
22222222222222222222
33333333333333333333
输出样例:
55555555555555555555
输入样例2:
134
866
输出样例2:
1000
三.解题思路
①存储大整数,并且输入。定义存储字符串
的数组和存储数字
的数组。
②获取字符串长度
③字符串倒序,将每一个数放到整型数组之中。
④获取最大的长度。
⑤从低位往高位运算。进行 位数相加
、 更新进位
、 保留位数
的操作。
⑥定义flag变量,将值初始化为0。
⑦倒着遍历。如果进位溢出,就需要更新长度,即 len+1。
我们还需要处理前导0的问题,最前面的位数不等于0,就可以标记为1,再利用标记进行后面数字的输出。
四.图形解释
模拟法