高精度:
高精度算法(High Accuracy Algorithm)是处理大数字的数学计算方法。在一般的科学计算中,
会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,
高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算。
对于非常庞大的数字无法在计算机中正常存储,于是,将这个数字拆开,拆成一位一位的,
或者是四位四位的存储到一个数组中,用一个数组去表示一个数字,这样这个数字就被称为是高精度数。
高精度算法就是能处理高精度数各种运算的算法,但又因其特殊性,故从普通数的算法中分离,自成一家。
加法:
高精度加法是信息学的一种重要算法。这种算法使用多个存储单位进行计算
,因此它的计算范围超过一般使用一个存储单位的算法。也是一些信息学竞赛的常考题目。
代码:
#include<bits/stdc++.h>
using namespace std;
vector<int> add(vector<int> &A, vector<int> &B){
if(A.size() < B.size()){
return add(B, A);
}
vector<int> C;
int t = 0;
for(int i = 0; i < A.size(); i ++){
t += A[i];
if (i < B.size()) t += B[i];
C.push_back(t % 10);
t /= 10;
}
if(t){
C.push_back(t);
}
return C;
}
int main(){
string a, b;
vector<int> A, B;
cin >> a >> b;
for(int i = a.size() - 1; i >= 0; i --){
A.push_back(a[i] - '0');
}
for(int i = b.size() - 1; i >= 0; i -- ){
B.push_back(b[i] - '0');
}
auto C = add(A, B);
for (int i = C.size() - 1; i >= 0; i -- ){
cout << C[i];
}
cout << endl;
return 0;
}
减法:
高精度减法和高精度加法相比,
减法在差为负数时处理的细节更多一点。
代码:
#include<bits/stdc++.h>
using namespace std;
vector<int> A, B;
bool cmp(vector<int> &A, vector<int> &B){
if(A.size() != B.size()){
return A.size() > B.size();
}
for(int i = A.size() - 1; i >= 0; i --){
if(A[i] != B[i]){
return A[i] > B[i];
}
}
return true;
}
vector<int> sub(vector<int> &A, vector<int> &B){
vector<int> C;
int t = 0;
for(int i = 0; i < A.size(); i ++){
t = A[i] - t;
if(i < B.size()){
t -= B[i];
}
C.push_back((t + 10) % 10);
if(t < 0){
t = 1;
}else{
t = 0;
}
}
while(C.size() > 1 && C.back() == 0){
C.pop_back();
}
return C;
}
int main(){
string a, b;
cin >> a >> b;
for(int i = a.size() - 1; i >= 0; i --){
A.push_back(a[i] - '0');
}
for(int i = b.size() - 1; i >= 0; i --){
B.push_back(b[i] - '0');
}
vector<int> C;
if(cmp(A, B)){
C = sub(A, B);
for(int i = C.size() - 1; i >= 0; i --){
cout << C[i];
}
}else{
C = sub(B, A);
cout << "-";
for(int i = C.size() - 1; i >= 0; i --){
cout << C[i];
}
}
return 0;
}
乘法:
对于计算机无法用普通数据类型表示的大整数进行乘法运算,称为高精度乘法。
代码:
#include<bits/stdc++.h>
using namespace std;
vector<int> mul(vector<int> & A, int & b){
vector<int> C;
int t = 0;
for(int i = 0; i < A.size() || t; ++ i){
if(i < A.size()) t += A[i] * b;
C.push_back(t % 10);
t /= 10;
}
while(C.size() > 1 && C.back() == 0){
C.pop_back();
}
return C;
}
int main(){
string a;
int b;
cin >> a >> b;
vector<int> A;
for(int i = a.size() - 1; i >= 0; -- i){
A.push_back(a[i] - '0');
}
auto C = mul(A, b);
for(int i = C.size() - 1; i >= 0; -- i){
cout << C[i];
}
cout << endl;
return 0;
}
除法:
代码:
(用 Python 来做最简单)
a = int(input())
b = int(input())
print(a // b)
print(a % b)
o( ̄▽ ̄)d
o( ̄▽ ̄)d
哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈最后除法的解法看了简直就是猝不及防
哈哈