高精度是什么
计算数据过大超过long long的数据范围时,需要引进高精度算法。将数一位一位的存在数组中输出。
高精度加法
cpp
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char a1[10000], b1[10000];//字符存储数字
int a[10000], b[10000], c[10000];//存储相加结果
int len_a, len_b, len_c = 1, x, i;
memset(a, 0, sizeof(a));//清零
memset(b, 0, sizeof(b));
memset(c, 0, sizeof(c));
cin >> a1 >> b1;//输入两个加数
len_a = strlen(a1);//计算字符串长度
len_b = strlen(b1);
for (i = 0; i < len_a; i++)a[len_a - i] = a1[i] - '0';//将加数存在a数组
for (i = 0; i < len_b; i++)b[len_b - i] = b1[i] - '0';//将另一个数存在b数组
x = 0;//x为进位
while (len_c <= len_a || len_c <= len_b)
{
c[len_c] = a[len_c] + b[len_c] + x;//两数相加,再加上前两个数进位的
x = c[len_c] / 10;
c[len_c] %= 10;
len_c++;//位数++
}
c[len_c] = x;
if (c[len_c] == 0)//判断首位是否为0
{
len_c--;//位数--
}
//输出每一位
for (int i = len_c; i >= 1; i--)
{
cout << c[i];
}
return 0;
}
高精度减法
cpp
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char a1[10000], b1[10000];//字符存储数字
int a[10000], b[10000], c[10000];//存储相减结果
int len_a, len_b, len_c = 1, x, i;
memset(a, 0, sizeof(a));//清零
memset(b, 0, sizeof(b));
memset(c, 0, sizeof(c));
cin >> a1 >> b1;//输入
len_a = strlen(a1);//计算字符串长度
len_b = strlen(b1);
for (i = 0; i < len_a; i++)a[len_a - i] = a1[i] - '0';
for (i = 0; i < len_b; i++)b[len_b - i] = b1[i] - '0';
i = 1;
while (i <= len_a || i <= len_b)
{
if (a[i] < b[i])
{
c[i] = a[i] + 10 - b[i];
a[i + 1]--;//借位
}
else
{
c[i] = a[i] - b[i];
}
i++;
}
len_c = i;
while (c[len_c] == 0 && len_c > 1)
{
len_c--;
}
//输出每一位
for (int i = len_c; i >= 1; i--)
{
cout << c[i];
}
return 0;
}
高精度乘法
cpp
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char a1[10000], b1[10000];//字符存储数字
int a[10000], b[10000], c[10000];//存储相减结果
int len_a, len_b, len_c = 1, x, i, j;
memset(a, 0, sizeof(a));//清零
memset(b, 0, sizeof(b));
memset(c, 0, sizeof(c));
cin >> a1 >> b1;//输入
len_a = strlen(a1);//计算字符串长度
len_b = strlen(b1);
for (i = 0; i < len_a; i++)a[len_a - i] = a1[i] - '0';
for (i = 0; i < len_b; i++)b[len_b - i] = b1[i] - '0';
for (i = 1; i <= len_a; i++)
{
x = 0;
for (j = 0; j <= len_b; j++)
{
c[i + j - 1] += x + a[i] * b[i];
x = c[i + j - 1] / 10;//进位
c[i + j - 1] %= 10;
}
c[i + len_b] = x;//进位的数
}
len_c = len_a + len_b;
while (c[len_c] == 0 && len_c > 1)
{
len_c--;
}
//输出每一位
for (int i = len_c; i >= 1; i--)
{
cout << c[i];
}
return 0;
}