目录
一:高精度概念:处理大数字的计算方法。(顾名思义就是在计算大数字的一种算法,为什么要用这种算法呢?我们日常计算的是位数相对较少,精确度不高。当遇到一些位数很多精度更高的时候就需要用到这个算法。)
二 高精度加法
首先我们来看一下代码:
#include<iostream>
#include<vector>
#include<string>
using namespace std;
vector<int>add(vector<int>& A, vector<int>& B)
{
int t = 0;//定义一个进位t
if (A.size() < B.size())//如果A小于B相加时将两个数字调换
add(B, A);
vector<int>C;
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每一个数字输入A数组中,将最高为存在数组的最后
{
A.push_back(a[i] - '0');
}
for (int i = b.size() - 1; i >= 0; i--)//将b每一个数字输入B数组中,同上
{
B.push_back(b[i] - '0');
}
auto c=add(A, B);//调用相加函数
for (int i = c.size() - 1; i >= 0; i--)//将数组从高为到低位依次输出
{
cout << c[i];
}
return 0;
}
高精度加法相对容易理解,这个代码中的“t”是一个进位的作用,当t>=10时向高位进一位,当t<0时,则不进位。
其他的就是关于头文件<vector>的语法,这个后续我会进行补充。
这个就是加法的代码,如果有什么疑问欢迎评论,共同进步~~。
三 高精度减法
关于高精度减法比加法略微复杂,因为需要进行判断两个数的大小,还有在这里说明一下:两个数均为正整数。话不多说直接看代码。
#include<iostream>
#include<vector>
#include<string>
using namespace std;
bool cmp(vector<int>& A, vector<int>& B)//A>B返回值为true
{
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 = t-B[i];
C.push_back((t + 10) % 10);
if (t >= 0)t = 0;
else
t = 1;
}
while (C.size() > 0 && C.back() == 0)//抹除最高位为0的情况 如111-110=001;可以削去0;
C.pop_back();
return C;
}
int main()
{
string a, b;
vector <int>A, B;
cin >> a >> b;
for (int i = a.size() - 1; i >= 0; i--)//将数字a输入到数组A中,最高位放在数组最后一位
{
A. push_back(a[i] - '0');
}
for (int i = b.size() - 1; i >= 0; i--)//将数字b输入到数组B中,同上
{
B.push_back(b[i] - '0');
}
vector<int>C;
if (cmp(A, B))//cmp为判断A,B的大小
{
C = sub(A, B);//A大于B,A-B
}
else
{
C = sub(B, A);//A小于B,B-A
cout << "-";//输出时前面加负号
}
for (int i = C.size() - 1; i >= 0; i--)//输出结果
{
cout << C[i];
}
return 0;
}
具体情况代码中有注释,可以在草稿纸上进行演算,来推导代码是如何运行的。
希望这篇文章对大家有所帮助,如果有什么疑问,欢迎来讨论~,共同进步。