【ACdream 1061- 郭式树】+ 大数运算

郭橐驼,不知始何名。病偻,隆然伏行,有类橐驼者,故乡人号之驼。驼闻之,曰:“甚善。名我固当。”因舍其名,亦自谓橐驼云。其乡曰丰乐乡,在长安西。驼业种树,凡长安豪富人为观游及卖果者,皆争迎取养。视驼所种树,或移徙,无不活;且硕茂,蚤实以蕃。他植者虽窥伺效慕,莫能如也。   有问之,对曰:“橐驼非能使木寿且孳也,以能顺木之天,以致其性焉尔。凡植木之性,其本欲舒,其培欲平,其土欲故,其筑欲密。既然已,勿动勿虑,去不复顾。其莳也若子,其置也若弃,则其天者全,而其性得矣。故吾不害其长而已,非有能硕而茂之也。不抑耗其实而已,非有能蚤而蕃之也。他植者则不然:根拳而土易。其培之也,若不过焉则不及。苟有能反是者,则又爱之太殷,忧之太勤。旦视而暮抚,已去而复顾;甚者爪其肤以验其生枯,摇其本以观其疏密,而木之性日以离矣。虽曰爱之,其实害之;虽曰忧之,其实仇之,故不我若也,吾又何能为哉?”

相传郭橐驼又在种树了,他沿着一条笔直的马路种了3棵树A,B,C。

不过忘记了ABC从左到右的顺序,他只知道B在A的右方 x 步处(如果 x 为负则B在A的左方 -x 步处),C在A的右方 y 步处(如果 y 为负责C在A左方 -y 步处)。

他想知道BC距离多少步(答案一定为正数且不为0)。

因为他种的树太多了,他只知道 |x|, |y| (取绝对值, |1| = 1, |-2| = 2) ≤ 4611686018427387904

Input
第一行是数据组数T(T ≤ 100000)

每组数据两个整数 x , y (-4611686018427387904 ≤ x, y ≤ 4611686018427387904)

Output
对于每组数据输出一个正数代表BC间的距离

Sample Input
2
1 2
4611686018427387904 -4611686018427387904
Sample Output
1
9223372036854775808

AC代码:

#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long LL;
char s1[20],s2[20];
int s[20];
int main()
{
    LL T;
    scanf("%lld",&T);
    while(T--){
        scanf("%s %s",s1,s2);
        int n1 = strlen(s1);
        int n2 = strlen(s2);
        int nn = 0,l1 = 0,l2 = 0;
        if((s1[0] == '-' && s2[0] != '-') || (s1[0] != '-' && s2[0] =='-')){
            if(s1[0] == '-') l1++;
            if(s2[0] == '-') l2++;
            int q = 0,p;
            n1--;n2--;
            while(l1 <= n1 || l2 <= n2){
                if(l1 > n1){
                    p = s2[n2--] - '0' + q;
                    q = p / 10;
                    s[nn++] = p % 10;
                }
                else if(l2 > n2){
                    p = s1[n1--] - '0' + q;
                    q = p / 10;
                    s[nn++] = p % 10;
                }
                else{
                    p = s1[n1--] - '0' + s2[n2--] - '0' + q;
                    q = p / 10;
                    s[nn++] = p % 10;
                }
            }
            if(q) s[nn++] = q;
            for(int i = nn - 1; i >= 0; i--) printf("%d",s[i]);
            printf("\n");
        }
        else{
             if(s1[0] == '-') l1++;
             if(s2[0] == '-') l2++;
             n1--;n2--;
             int ok = 1;
             int p1 = l1,p2 = l2;
             while(s1[p1] == s2[p2]) p1++,p2++;
             if(s1[p1] > s2[p2]) ok = 0;
             if((!ok && n1 == n2) || n1 > n2){
                    int p = 0;
                    while(n1 >= l1){
                    if(n2 < l2) s[nn++] = s1[n1--] - '0';
                    else{
                    int a1 = s1[n1--] - '0',a2 = s2[n2--] - '0';
                    if(a1 >= a2)
                        s[nn++] = a1 - a2;
                    else{
                        s[nn++] = a1 - a2 + 10;
                        int pp = n1;
                        while(s1[pp] == '0') pp--;
                        s1[pp] -= 1;
                        pp++;
                        while(pp <= n1) s1[pp++] = '9';
                    }
                }
                }
             }
             else{
                    int p = 0;
                    while(n2 >= l2){
                    if(n1 < l1) s[nn++] = s2[n2--] - '0';
                    else{
                    int a1 = s1[n1--] - '0',a2 = s2[n2--] - '0';
                    if(a2 >= a1)
                        s[nn++] = a2 - a1;
                    else{
                        s[nn++] = a2 - a1 + 10;
                        int pp = n2;
                        while(s2[pp] == '0') pp--;
                        s2[pp] -= 1;
                        pp++;
                        while(pp <= n2) s2[pp++] = '9';
                    }
                }
                }
             }
             int o = 0;
             for(int i = nn - 1; i >= 0; i--){
                if(s[i]) o = 1;
                if(o == 0) continue;
                printf("%d",s[i]);
             }
             printf("\n");
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值