本蒟蒻在写这道题的时候遇到了一个问题,我先是提交了以下代码:
#include <cstdio>
#include <cstring>
const int maxn = 1e4 + 100;
struct hp
{
bool sign; // 符号,正为true
int a[maxn]; // 这个数,但是从个位开始
char str[maxn]; // 输入的字符串
int len; // 这个数的长度
void init() // 初始化
{
len = 0;
sign = true;
for(int i = 0; i < maxn; i++)
a[i] = str[i] = 0;
}
void Init()
{
scanf("%s",str);
len = strlen(str);
sign = true;
for(int i = len - 1; i >= 0; i--)
a[len - i - 1] = str[i] - '0';
}
void Print() // 打印
{
if(!sign)
printf("-");
printf("%s\n",str);
}
int Compare(const hp x) // 比较两个数的大小,大就是1,小就是-1,相等为0
{
if(len < x.len)
return -1;
else if(len > x.len)
return 1;
else
{
for(int i = len - 1; i >= 0; i--)
{
if(a[i] < x.a[i])
return -1;
else if(a[i] > x.a[i])
return 1;
}
}
return 0;
}
};
inline void UpdateLen(hp& a) // 更新长度
{
int i;
for(i = maxn; i > 0 && a.a[i] == 0; i--);
a.len = i + 1;
}
inline void UpdateStr(hp& a) // 更新字符串以便输出
{
for(int i = 0; i < a.len; i++)
a.str[i] = a.a[a.len - i - 1] + '0';
}
hp Minus(hp a, hp b)
{
hp ans;
ans.init();
if(a.Compare(b) == -1) //首先比较大小,小就交换一下
{
hp tmp = a;
a = b;
b = tmp;
ans.sign = false;
}
for(int i = 0; i < a.len; i++) // 从个位开始相减
{
ans.a[i] += a.a[i] - b.a[i];
if(ans.a[i] < 0)
{
int tmp = -ans.a[i] / 10 + 1;
ans.a[i] += tmp * 10;
ans.a[i + 1] -= tmp;
}
}
UpdateLen(ans); // 更新长度防止高位为0的情况
UpdateStr(ans);
return ans;
}
int main()
{
hp a, b;
a.Init();
b.Init();
Minus(a, b).Print();
return 0;
}
然后部分样例WA了,但是我将其中的
if(ans.a[i] < 0) // 向前借位
{
int tmp = -ans.a[i] / 10 + 1;
ans.a[i] += tmp * 10;
ans.a[i + 1] -= tmp;
}
改成了现在的
while(ans.a[i] < 0)
{
ans.a[i] += 10;
ans.a[i + 1]--;
}
然后就AC了??我始终看不出来这两种方法最后的结果有什么区别,求各位dalao解答一下。。。。