PAT--1065 A+B and C (64bit)(大数加减法)

本题是要做大数加减法,故用string来实现。操作数有以下4种情况:正+正,负+负,正+负,负+正,前两种用加法实现,后两种用减法实现。
大数加法
大数加法实现很简单,首先对齐,之后再进行加法操作即可。
大数减法
大数减法的实现思路是首先判断二者差的符号,这很好判断,而且在算出结果之前就可以判断出来,然后始终令a是绝对值较大的那一个,b是绝对值较小的那一个。接下来也进行对齐操作,然后计算a-b即可,最后加上前面算出的符号。例如计算-123+670,那么判断符号为正,然后令a=670, b=123, 最终结果就是547

#include <iostream>
#include <string>

using namespace std;

//a b 都大于0, 若a > b 返回true,否则返回false
bool cmp(string a, string b)
{
    if(a.size() > b.size())
        return true;
    if(a.size() < b.size())
        return false;
    for(int i = 0; i < a.size(); i++)
    {
        if(a[i] == b[i])
            continue;
        else if(a[i] > b[i])
            return true;
        else
            return false;
    }
    return false;    //a == b;
}

bool compare(string a, string b)
{
    if(a[0] == '-' || b[0] == '-')
    {
        if(a[0] == '-' && b[0] != '-')
            return false;
        if(a[0] != '-' && b[0] == '-')
            return true;
        if(a[0] == b[0] && b[0] == '-')
            return !cmp(a.substr(1, a.size()), b.substr(1, b.size()));
    }
    else
        return cmp(a, b);
}

string sum(string a, string b)
{
    if(a.size() < b.size())
    {
        string tmp = a;
        a = b;
        b = tmp;
    }
    int leng = a.size() - b.size();
    for(int i = 0; i < leng; i++)
        b = '0'+b;
    bool flag = false;    //进位位
    int tmp;
    string ans;
    for(int i = a.size()-1; i >= 0; i--)
    {
        tmp = a[i]+b[i]-'0'-'0' + flag;
        if(tmp >= 10)
        {
            tmp -= 10;
            flag = true;
        }
        else
            flag = false;
        ans = (char)(tmp+'0') + ans;
    }
    if(flag)
        ans = '1' + ans;
    return ans;
}

string sub(string a, string b)
{
    bool flag0 = false;
    if(a[0] != '-' && a.size() >= b.size())
        flag0 = true;    //代表减法结果的正负
    if(a[0] == '-' && a.size() <= b.size())
        flag0 = true;

    if(a[0] == '-')
    {
        string tmp = a;
        a = b;
        b = tmp;
    }
    //123  -2345这种情况
    if(a.size()+1 < b.size())
    {
        string tmp = a;
        a = b.substr(1, b.size());
        b = tmp;
    }
    //123  -670这种情况
    if(a.size()+1 == b.size() && !cmp(a, b.substr(1, b.size())))
    {
        string tmp = a;
        a = b.substr(1, b.size());
        b = tmp;
    }
    if(b[0] == '-')
        b = b.substr(1, b.size());
    //这时a, b都没有负号,且a是较大的那个, b是较小的那个
    int leng = a.size() - b.size();
    for(int i = 0; i < leng; i++)
        b = '0'+b;
    bool flag = false;    //借位位
    int tmp;
    string ans;
    for(int i = a.size()-1; i >= 0; i--)
    {
        tmp = a[i]-b[i] - flag;
        if(tmp < 0)
        {
            tmp += 10;
            flag = true;
        }
        else
            flag = false;
        ans = (char)(tmp+'0') + ans;
    }
    if(flag0)
        return ans;
    else
        return '-'+ans;
}


int main()
{
    int n;
    cin >> n;
    string a, b, c;
    for(int i = 1; i <= n; i++)
    {
        cin >> a >> b >> c;
        string ans;
        if(a[0] == '-' && b[0] != '-' || a[0] != '-' && b[0] == '-')
            ans = sub(a, b);
        else if(a[0] == b[0] && b[0] == '-')
            ans = '-' + sum(a.substr(1, a.size()), b.substr(1, b.size()));
        else
            ans = sum(a, b);
        //cout << "--------- "<<  ans << endl;
        if(compare(ans, c))
            cout << "Case #" << i << ": true" << endl;
        else
            cout << "Case #" << i << ": false" << endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值