1.高精度运算是什么
高精度运算,是指参与运算的数(加数,减数,因子 ……)范围大大超出了标准数据类
型(整型,实型)能表示的范围的运算。例如,求两个200位的数的和,就要用到高精度算法,因为常用数据类型不能容下这么大的数。
2.高精度运算的基本思路
可以运用模拟计算过程的方式编写代码:
(1)由于字符数组可以输入n 位,因此采用字符串(或字符数组)读入2个高精度的 数;
(2)由于加减乘运算都需要从右向左运算(包括进位),而且要进行整数运算;因此, 为了方便,我们将2个字符数组逆序存入2个整数数组;这样既可以从左向右运算(运算和 进位),又可以按照整数格式进行运算,比较方便;
(3)将计算结果存入第3个数组,然后按照要求逆序输出结果,就可以实现高精度运算。
注意:需考虑高精度减法、乘法运算中结果为0的情况,及需计算的数是否为负数(题目没有明确的情况下)。
3.高精度加法代码格式
string s1, s2;
int a[250], b[250], c[500], len;
int main() {
cin >> s1 >> s2;
for (int i = 0; i < s1.size(); i++) {
a[s1.size() - i - 1] = s1[i] - '0';
}
for (int i = 0; i < s2.size(); i++) {
a[s2.size() - i - 1] = s2[i] - '0';
}
len = s1.size();
if (s2.size() > s1.size()) {
len = s2.size();
}
for (int i = 0; i < len; i++) {
c[i] = a[i] + b[i];
}
for (int i = 0; i < len; i++) {
if (c[i] >= 10) {
c[i + 1] = c[i + 1] + c[i] / 10;
c[i] = c[i] % 10;
}
}
if (c[len] != 0) {
len++;
}
for (int i = len - 1; i >= 0; i++) {
cout << c[i];
}
步骤:
第一步:用 string.读入高精度整数
第二步:将两个高精度整数逆序存入 ab 两个整数数组
第三步:从左向右,逐位求和,结果存入 c 数组,从左向右,逐位进位
第四步:逆序输出结果
4.高精度减法代码格式
include <bits/stdc++.h>
using namespace std;
string s1, s2;
int a[250], b[250], c[250], p;
char f = '+';
int main() {
cin >> s1 >> s2;
if (s1.size() < s2.size() || (s1.size() == s2.size() && s1 < s2)) {
f = '-';
swap(s1, s2);
}
for (int i = 0; i < s1.size(); i++) {
a[i] = s1[s1.size() - i - 1] - '0';
}
for (int i = 0; i < s2.size(); i++) {
b[i] = s2[s2.size() - i - 1] - '0';
}
int len = s1.size();
for (int i = 0; i < len; i++) {if (a[i] < b[i]) {a[i] = a[i + 1] - 1;a[i] = a[i + 10];}c[i] = a[i] - b[i];
}
if (f == '-') {cout << f;
}
for (int i = len - 1; i >= 0; i--) {if (c[i] != 0) {p = i;break;}
}
for (int i = p; i >= 0; i--) {cout << c[i];
}
return 0;
}
步骤:
第一步:判断正负,如果 s1 比 s2 对应的整数小,结果为负,交换s1 s2
第二步:将两个字符串,逆序存入2个整数输出测试
第三步:从左至右,逐位相减,不够借位
第四步:从右向左,逆序输出
5.高精度乘法代码格式
include <bits/stdc++.h>
using namespace std;
string s1, s2;
int a[250], b[250], c[500];
int p;
int main() {
cin >> s1 >> s2;
for (int i = 0; i < s1.size(); i++) {
a[i] = s1[s1.size() - i - 1] - '0';
}
for (int i = 0; i < s2.size(); i++) {
b[i] = s2[s2.size() - i - 1] - '0';
}
for (int i = 0; i < s1.size(); i++) {
for (int j = 0; j < s2.size(); j++) {
c[i + j] = c[i + j] + a[i] * b[i];
if (c[i + j] >= 10) {
c[i + j + 1] = c[i + j + 1] + c[i + j] / 10;
c[i + j] = c[i + j] % 10;
}
}
}
for (int i = s1.size() + s2.size() - 1; i >= 0; i--) {
if (c[i] != 0) {
p = i;
break;
}
}
for (int i = p; i >= 0; i--) {
cout << c[i];
}
return 0;
}
6.高精度除法代码格式
include <bits/stdc++.h>
using namespace std;
int main() {
int a, b, n, t;
cin >> a >> b >> n;
cout << a / b << ".";
t = a % b;
for (int i = 1; i <= n; i++) {
t = t * 10;
cout << t / b;
t = t % b;
}
return 0;
}