当数据的值特别⼤,各种类型都存不下的时候,此时就要用高精度算法来计算加减乘除:
- 先用字符串读⼊这个数,然后用数组逆序存储该数的每⼀位;
- 利⽤数组,模拟加减乘除运算的过程。
高精度算法本质上还是模拟算法,用代码模拟小学列竖式计算加减乘除的过程。
1. 高精度加法
题⽬来源: 洛⾕
题⽬链接: P1601 A+B Problem(⾼精)
难度系数: ★
【解法】
模拟小学列竖式计算过程
- 先用字符串读⼊,拆分每一位,逆序放在数组中
- 利用数组,模拟小学列竖式计算加法的过程
(1)对应两位相加,然后加上进位
(2)处理进位 -> x/10
(3)处理余数 -> x%10
【参考代码】
#include<iostream>
using namespace std;const int N = 1e6 + 10;int a[N],b[N],c[N];
int la,lb,lc;
string s1,s2;int main(){cin >> s1 >> s2;//拆分每一位,逆序放在数组中 la = s1.size();lb = s2.size();lc = max(la,lb);for(int i = 0;i < la;i++){a[i] = s1[la-1-i] - '0';}for(int i = 0;i < lb;i++){b[i] = s2[lb-1-i] - '0';}//模拟加法的过程 for(int i = 0;i < lc;i++){int x = a[i] + b[i] + c[i];// 对应两位相加,然后加上进位c[i+1] = x / 10;//处理进位c[i] = x % 10;//处理余数}if(c[lc]) lc++;//边界情况 //输出结果 for(int i = lc - 1;i >= 0 ;i--){cout << c[i];}return 0;
}
2 .高精度减法
题⽬来源: 洛谷
题目链接: P2142 高精度减法
难度系数: ★
【解法】
- ⽤字符串读⼊数据,
- 判断两个数的大小,让较大的数在前。注意字典序 vs 数的大小
a. 位数相等:按字典序比较;
b. 位数不等:按照字符串的长度比较
3.将字符串的每⼀位拆分,逆序放在数组中;
4.模拟列竖式计算的过程
a. 对应位求差;
b. 处理借位;
5.处理前导零。
【参考代码】
#include<iostream>
using namespace std;const int N = 1e6 + 10;
int a[N],b[N],c[N];
int la,lb,lc;bool cmp(string& x,string& y){//先比较长度 if(x.size() != y.size()) return x.size() < y.size();//按字典序比较 return x < y;
}void sub(int a[],int b[],int c[]){for(int i = 0;i < lc;i++){c[i] += a[i] - b[i]; if(c[i] < 0){c[i + 1] -= 1; //处理借位c[i] += 10; }}//处理前导零while(lc > 1 && c[lc-1] == 0) lc--;
}
int main(){string x,y;cin >> x >> y;//比较两个数的大小if(cmp(x,y)){swap(x,y);cout << "-";}la = x.size();lb = y.size();lc = la;//将字符串的每一位拆分,逆序放在数组中for(int i = 0;i < la;i++) a[i] = x[la - 1 - i] - '0';for(int i = 0;i < lb;i++) b[i] = y[lb - 1 - i] - '0';//减法sub(a,b,c);//输出结果for(int i = lc - 1;i >= 0;i++) cout << c[i]; return 0;
}