高精度是什么
计算数据过大超过long long的数据范围时,需要引进高精度算法。将数一位一位的存在数组中输出。
高精度加法
#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;
}
高精度减法
#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;
}
高精度乘法
#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;
}