PAT A1065 A+B and C (64bit) ——斜风细雨不须归

PAT A1065 A+B and C (64bit)

  • 试验大整数运算?我真不是故意的,只因为上了贼船,便想一条路走到黑。。。
  • 对string不知抱有何种执念,直到搞到需要比较大小的时候软了,觉得还不如用long long直接比,然而换成long long之后又并没有直接比,大概是因为异号的时候要用减法,仍然需要知道绝对值大的那个,作为第一个参数,并让娃跟他一个姓
  • 不过后来看到网上有同学全程用的string
  • 绝对值开始用abs来着,试了C++ 11下可以接受long long,but我的电脑上不行,又不敢直接加负号,怕取到下限时溢出。。。只好写了个cmp统一解决比较大小和绝对值的问题,,,
  • 负数转BigInt的时候会把每一位都给搞成负的(a % b,a < 0时,不管b的正负,结果都是负的),又打了补丁,浪费感情,还不如用string。。。
  • 大整数加减法别忘了出了循环之后还有一件事情要做(进位和前面的0)
  • 最最可恶的是,这一番作死的操作之后,居然最后一个测试点挂了。。。不知道是为毛
  • 在这里插入图片描述
#include <iostream>

using namespace std;

struct BigInt{
    int len = 0;
    int data[100] = {0};
    int sign = 1;
};

BigInt convert(long long ll){
    BigInt res;
    if(ll < 0) res.sign = -1;
    do{
        res.data[res.len ++] = ll % 10;
        if(res.sign == -1) res.data[res.len - 1] = -res.data[res.len - 1];
        ll /= 10;
    }while(ll);
    return res;
}

BigInt add(BigInt a,BigInt b){
    BigInt res;
    int carry = 0;
    for(int i = 0;i < a.len || i < b.len;i ++){
        res.data[res.len ++] = (a.data[i] + b.data[i] + carry) % 10;
        carry = (a.data[i] + b.data[i] + carry) / 10;
    }
    if(carry) res.data[res.len ++] = 1;
    return res;
}

BigInt _minus(BigInt a,BigInt b){
    BigInt res;
    for(int i = 0;i < a.len || i < b.len;i ++){
        if(a.data[i] < b.data[i]){
            a.data[i] += 10;
            a.data[i + 1] --;
        } 
        res.data[res.len ++] = a.data[i] - b.data[i];
    }
    while(res.data[res.len - 1] == 0 && res.len > 1){
        res.len --;
    }
    return res;
}

int cmp(BigInt a,BigInt b,bool abs){
    if(!abs && a.sign != b.sign) return a.sign - b.sign;
    else{
        if(a.len != b.len){
            int diff = (a.len - b.len);
            if(!abs) diff *= a.sign;
            return diff;
        } 
        else{
            for(int i = a.len - 1;i >= 0 ;i --){
                if(a.data[i] != b.data[i]){
                    int diff = (a.data[i] - b.data[i]);
                    if(!abs) diff *= a.sign;
                    return diff;
                }
            }
            return 0;
        }
    }
}

#define DEBUG 

int main(){

#ifdef DEBUG
	freopen("1.txt","r",stdin);	
#endif

    int num;
    cin >> num;
    for(int i = 0;i < num;i ++){
        long long A,B,C;
        cin >> A >> B >> C;
        C = C << 62;cout << C << endl;
        BigInt a = convert(A);
        BigInt b = convert(B);
        BigInt c;
        if(a.sign == b.sign){
            c = add(a,b);
            c.sign = a.sign;
        }else{
            if(cmp(a,b,true) > 0){
                c = _minus(a,b);
                c.sign = a.sign;
            }  
            else{
                c = _minus(b,a);
                c.sign = b.sign;
            } 
        }
        printf("Case #%d: ",i + 1);
        BigInt cc = convert(C);
        cout << "c = " << c.sign << ' ';
        for(int i = c.len - 1;i >= 0 ;i --) cout << c.data[i];
        if(cmp(c,cc,false) > 0) printf("true\n");
        else printf("false\n");
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值