提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
高精度计算对于超出常规数值规模的数的存储与计算应用广泛,高精度除法是其难点,本篇文章分析高精度除低精度时的常规方法,以及存储高精度数组元素时保留多位数的方法(笔者发现网络上对于保留多位数的方法介绍较少)。
提示:以下是本篇文章正文内容,下面案例可供参考
一、高精度除以低精度常规方法(保留一位数)
1.代码:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
//using namespace std;
int main(void)
{
char a1[101];
int a[101], c[101], lena, i, x = 0, lenc, b;
memset(a, 0, sizeof(a));
memset(c, 0, sizeof(c));
cin >> a1;
cin >> b;
lena = strlen(a1);
for (i = 0; i <= lena - 1; i++) {
a[i + 1] = a1[i] - 48;
}
for (i = 1; i <= lena; i++) {
c[i] = (x * 10 + a[i]) / b;
x = (x * 10 + a[i]) % b;
}
lenc = 1;
while (c[lenc] == 0 && lenc < lena) {
lenc++;
}
for (i = lenc; i <= lena; i++) {
cout << c[i];
}
cout << endl;
return 0;
}
2.读入数据
读入数据如下:
123456789 45
3.输出结果
2743484
二、高精度除以低精度拓展方法(保留多位数)
1.代码
#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdio>
using namespace std;
int main(void)
{
char a1[101]; //输入高精度被除数
int a[101], c[101], lena, lenc, b, x = 0, i, j, per, k;//a代表转换数组,c代表结果数组,b为除数,x为余数,per代表存储时保留位数
memset(a, 0, sizeof(a)); //初始化数组
memset(c, 0, sizeof(c));
cin >> a1; //输入被除数
cin >> b; //输入除数
cin >> per; //输入保留位数
int num = pow(10, per); //用于处理余数
lena = strlen(a1);
//e.g.per == 4时,123456789->1'2345'6789,x用于处理前面长度小于per的数,这里就是1
x = lena % per;
for (i = 0; i < x; i++) {
a[1] = (a1[i] - 48) + a[1]*10;
}
//用两层循环嵌套存储后面以per为单位一组的数据,k指向第二组数据
for (i = x,k = 2; i < lena; i += per) {
for (j = i; j < i + per; j++) {
a[k] = a[k] * 10 + a1[j] - 48;
}
k++; //k用来记录数量,注意:最终k的值比实际数组数量多1
}
x = 0; //再次初始化x为0
//进行除法
for (i = 1; i < k; i++) {
c[i] = (x * num + a[i]) / b;
x = (x * num + a[i]) % b;
}
lenc = 1;
while (c[lenc] == 0 && lenc < lena)lenc++;
for (i = lenc; i < k; i++) {
cout << c[i];
}
cout << endl;
return 0;
}
2.输入数据
123456789 45 4
3.输出数据
2743484
总结
在进行高精度运算时,对于高精度数的存储采用保留多位数的方法(特别是乘法运算)可以减少很多次操作,笔者对于保留多位数的处理采用二层循环嵌套有损时间复杂度,欢迎更好的方法和大佬的批评指正。