目录
一、为什么要使用高精度加法
当处理远大于long long
数据范围的数时,通常会将这些大数表示为字符串,然后通过字符串的方式进行加减乘除运算。在处理大数运算时,我们可以通过模拟手工计算的方式来实现加减乘除运算,例如加法:从个位开始逐位相加。
二、处理前导零
1、为什么要处理前导零
提到高精度算法就不得不提到前导零,由于题目给我们的数据经常是:a=00112,b=00223 这样类型的因此在进行基本运算时我们要先获得去除前导零的串
2、处理前导零的代码
把需要处理的字符串传到这个data_pre函数中即可
string data_pre(string num){
int i=0;
while(i<num.size()&&num[i]=='0'){
i++;
}
if(i==num.size()){return "0";} //如果i会等于num的长度就说明num全是0
else return num.substr(i); //substr(i)的意思是截取i之后到末尾的数
}
三、处理大数相加
具体步骤写在代码注释
int main(){
string a,b;
string res;
int carry=0;
cin>>a>>b;
a=data_pre(a);
b=data_pre(b);
int i=a.size()-1,j=b.size()-1; // 让i,和j分别指向a和b的最后一位
while(i>=0||j>=0||carry>0){
int data1,data2;// 每一轮循环定义两个数,分别代表a[i]和b[i]在这一位的数
if(i>=0){
data1=a[i]-'0';
i--;
} else{
data1=0;
}
if(j>=0){
data2=b[j]-'0';
j--;
} else{
data2=0;
}
int sum=data1+data2+carry;
carry=sum/10; //carry就是进位
res+=sum%10+'0';
}
reverse(res.begin(),res.end());
四、完整代码即例题
例题链接:https://ac.nowcoder.com/acm/problem/226350
#include<bits/stdc++.h>
using namespace std;
// 函数用于去除字符串前面的零
string data_pre(string num){
int i=0;
while(i<num.size() && num[i]=='0'){
i++;
}
if(i==num.size()){
return "0";
} else{
return num.substr(i);
}
}
int main(){
string a, b;
string res;
cin >> a >> b;
a = data_pre(a);
b = data_pre(b);
int m = a.size()-1, n = b.size()-1;
int carry = 0;
while(m>=0 || n>=0 || carry>0){
int digit1, digit2;
if(m>=0){
digit1 = a[m] - '0'; // 获取当前位数字
m--;
} else{
digit1 = 0; // 若已遍历完a,设当前位为0
}
if(n>=0){
digit2 = b[n] - '0'; // 获取当前位数字
n--;
} else{
digit2 = 0; // 若已遍历完b,设当前位为0
}
int sum = digit1 + digit2 + carry; // 计算当前位相加之和
res += sum % 10 + '0'; // 将当前位的结果加入到res中
carry = sum / 10; // 更新进位
}
reverse(res.begin(), res.end()); // 反转结果字符串
cout << res << endl; // 输出计算结果
}
标签:pre,大数,int,res,----,carry,前导,数据结构,data
From: https://blog.csdn.net/2301_77961281/article/details/136692596