这次的高精度减法套用的高精度加法的模板,有兴趣的小伙伴可以去看看高精度加法!(链接在文章末尾)
平常我们使用C++编写一个减法程序,两三行代码就完事了。
就像这样:
#include<iostream>
using namespace std;
int main()
{
int x,y;
cin>>x>>y;
cout<<x-y<<endl;
return 0;
}
普通的计算数据(如12-11;123123-3213)运行出来也没有问题。
既是数据再大些,把x,y的变量类型改为long long int也能计算的出来。
但是你要是看到这样的数据:
319208301283172391212838302938120 - 27318127312937127381236127371284
再使用这个两三行代码的程序,也只能够达到变量类型的最大范围。
所以!这个时候,我们就要用到我们的高精度算法了。
话不多说!直接上代码!
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const int MAXN=10005;
int A[MAXN],B[MAXN],C[MAXN],Ans[MAXN],Len_A,Len_B,Len_Ans;
void Read(int *A,int &Len){
string cur;
cin>>cur;
Len=cur.length();
for(int i=0;i<Len;i++) A[i]=cur[i]-48;
reverse(A,A+Len);
}
int main()
{
Read(A,Len_A);
Read(B,Len_B);
Len_Ans=max(Len_A,Len_B);
for(int i=0;i<Len_Ans;i++){
Ans[i]=A[i]-B[i]-C[i];
if(Ans[i]<0) C[i+1]++,Ans[i]+=10;
}
while(Len_Ans>1&&Ans[Len_Ans-1]==0) Len_Ans--;
for(int i=Len_Ans-1;i>=0;i--)
cout<<Ans[i];
return 0;
}
运行一下:
同样还有一个稍微优化的程序代码:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const int MAXN = 10005;
int A[MAXN], B[MAXN], C[MAXN], Ans[MAXN], Len_A, Len_B, Len_Ans;
void Read(int* A, int& Len) {
string cur;
cin >> cur;
Len = cur.length();
for (int i = Len - 1, j = 0; i >= 0; i--, j++)
A[j] = cur[i] - 48;
}
int main()
{
Read(A, Len_A);
Read(B, Len_B);
Len_Ans = (Len_A > Len_B) ? Len_A : Len_B;
for (int i = 0; i < Len_Ans; i++) {
Ans[i] = A[i] - B[i] - C[i];
if (Ans[i] < 0) {
Ans[i] += 10;
C[i + 1] = 1;
}
}
while (Len_Ans > 1 && Ans[Len_Ans - 1] == 0) Len_Ans--;
for (int i = Len_Ans - 1; i >= 0; i--)
cout << Ans[i];
return 0;
}
直接轻松算出来
319208301283172391212838302938120 - 27318127312937127381236127371284
=291890173970235263831602175566836
再大点的数据都可以!
如:
高精度加法:
如果你有什么想实现的,评论区见!