题解 P2142 【高精度减法】
这一道题目我用的是一种很简单明了的方法(其实是因为其他大佬的看不懂)
主要是用了c++对于字符串来说十分神奇的+号来通过加0来对齐个位(方便计算),同时要用循环加上一个开关来看是否需要进行退位,还有,如果a<b,可以先输出减号然后交换a和b来计算,剩下的就比较简单了,看一下代码的注释就可以了。
奉上代码(应该都看的懂吧)
#include<bits/stdc++.h>
using namespace std;
string a,b;//需要用字符串来储存
int l,l1,c[10005],p;//每一位的差
int main()
{
cin>>a>>b;
a='0'+a;
b='0'+b;//将第0位占0
if(a.size()<b.size()||(a.size()==b.size()&&a<b))//假如a<b
{
cout<<'-';//结果为负数,先输出减号
swap(a,b);//交换两个数(例如3-5可以变为0-(5-3)),这样子方便后面计算
}
l=a.size();
l1=b.size();
while(l1<l)//因为已经确保这时b<a了,所以直接在b前面添0
{
b='0'+b;
l1++;
}//利用c++的特性让个位对齐
for(int i=1;i<l;i++)c[i]=a[i]-b[i];//计算差
while(1)//用来退位,因为可能要多次退位,所以用while循环
{
p=1;//开关,用来看是否需要退位
for(int i=1;i<l;i++)
{
if(c[i]<0)//需要退位
{
c[i-1]--;//向前一位退位
c[i]=10+c[i];
p=0;//开关置零,需要重新复查
}
}
if(p)break;//不需要退位了,就退出
}
p=1;
for(int i=1;i<l;i++)
{
if(c[i]!=0)p=0;
if(p==0)cout<<c[i];//特判前导0
}
if(p==1)cout<<0;//特判,可能结果本身就为0
return 0;
}