疑惑求助!!!
查看原帖
疑惑求助!!!
794001
Leew楼主2024/1/21 12:36

本蒟蒻在写这道题的时候遇到了一个问题,我先是提交了以下代码:

#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解答一下。。。。

2024/1/21 12:36
加载中...