蒟蒻的第一篇题解,求神犇指点orz
y总的写法本蒟蒻没太看懂,就用贫瘠的知识写了一个(
应该比y总的方法麻烦好多,自定义了一大堆玩意不说还要遍历整个数组好几回
同时也没法考虑减数和被减数中存在负数的情况(题上也没要求)
但能过就是成功(
直接上代码
#include<bits/stdc++.h>
using namespace std;
#define MAX 100005
int a[MAX];//存放被减数
int b[MAX]; //存放减数
void zh(string aa,int a[])//把string类的数倒序转换到数组里
{
int i,j=0;
for(i=aa.size()-1;i>=0;i--,j++)//int数组从0开始存入,string串从最后一位开始往里塞
a[j]=aa[i]-48;//转换
}
bool pd(string a,string b)//判断是否有负数情况,如果有返回true。函数主体里特殊处理了两个数相等的情况,故这里不作判断
{
if(a.size()!=b.size()) return b.size()>a.size();//如果a和b不一样长,判断最长(最大)的
else//如果一样
{
int i;
for(i=0;i<a.size();i++)//从最高位开始比较
if(a[i]!=b[i]) return b[i]>a[i];//如有不同返回最大的
}
}
void jf(int a[],int b[])//减法他来了!
{
int i;
for(i=0;i<MAX;i++)//从最低位开始算(倒序存储的嘛)
{
a[i]-=b[i];//暴力减过去,直接用a数组存答案
while(a[i]<0)//如果此时答案小于0
{
a[i+1]--;//借位,后一位-1
a[i]+=10;//这一位+10
}
}
}
int main()
{
string aa,bb;
int i,j;
cin>>aa>>bb;
if(aa==bb)//判断相等的特殊情况,直接输出0就可以跑路了
{
cout<<0;
return 0;
}
zh(aa,a);//不一样就转换
zh(bb,b);
if(pd(aa,bb))//判断哪个大
{
cout<<"-";//如果减数大就先输出个负号
swap(a,b);//然后交换减数和被减数
}
jf(a,b);
for(i=MAX-1;a[i]==0;i--);//因为答案是倒序存储的,所以要从后开始排除前导0
for(;i>=0;i--)//输出
cout<<a[i];
return 0;
}