AcWing 792. 高精度减法 (数组)
原题链接
简单
作者:
GRID
,
2021-03-16 15:47:51
,
所有人可见
,
阅读 202
分析
- 将两个数分别存入a[]和b[]
- 比较两个数的大小
- 用大数减去小数
- 输出最终结果
C++ 代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int a[N],b[N],l1,l2;
char s[N];
int cmp(int a[],int b[])
{
if(l1<l2) return 1; //首先长度更长的一定是大数
if(l2<l1) return 2;
for(int i=l1;i>=0;i--) //长度相等,从高位往低位比较
{
if(a[i]<b[i]) return 1;
if(a[i]>b[i]) return 2;
}
return 0; //两数完全相等返回0
}
void print(int a[]) //输出结果
{
int k=N-1;
while(k && !a[k]) k--; //去掉前导0
for(int i=k;i>=0;i--) cout<<a[i];
puts("");
}
void minu(int a[],int b[])
{
if(l1<l2) swap(l1,l2);
int t=0,temp[N];
memset(temp,0,sizeof temp);
for(int i=0;i<l1+1;i++)
{
t+=a[i]-b[i];
if(t<0){ //当前不够减,就向前借一位,之后t+10
a[i+1]-=1;
t+=10;
}
temp[i]=t%10;
t/=10;
}
memcpy(a,temp,sizeof temp); //将结果赋给a
}
int main()
{
scanf("%s",s);
l1=strlen(s);
for(int i=0;i<l1;i++) a[l1-i-1]=s[i]-'0';
scanf("%s",s);
l2=strlen(s);
for(int i=0;i<l2;i++) b[l2-i-1]=s[i]-'0';
int f=cmp(a,b);
if(f==0){ //完全相等,输出0
puts("0");
}
else if(f==1){ //b比a大,用b-a,前面加上负号,最终输出b
minu(b,a);
printf("-");
print(b);
}
else{ //a比b大,用a-b,最终输出a
minu(a,b);
print(a);
}
return 0;
}