Crawling in process...Crawling failedTime Limit:2000MS Memory Limit:128000KB 64bit IO Format:%lld & %llu
Description
郭橐驼,不知始何名。病偻,隆然伏行,有类橐驼者,故乡人号之驼。驼闻之,曰:“甚善。名我固当。”因舍其名,亦自谓橐驼云。其乡曰丰乐乡,在长安西。驼业种树,凡长安豪富人为观游及卖果者,皆争迎取养。视驼所种树,或移徙,无不活;且硕茂,蚤实以蕃。他植者虽窥伺效慕,莫能如也。 有问之,对曰:“橐驼非能使木寿且孳也,以能顺木之天,以致其性焉尔。凡植木之性,其本欲舒,其培欲平,其土欲故,其筑欲密。既然已,勿动勿虑,去不复顾。其莳也若子,其置也若弃,则其天者全,而其性得矣。故吾不害其长而已,非有能硕而茂之也。不抑耗其实而已,非有能蚤而蕃之也。他植者则不然:根拳而土易。其培之也,若不过焉则不及。苟有能反是者,则又爱之太殷,忧之太勤。旦视而暮抚,已去而复顾;甚者爪其肤以验其生枯,摇其本以观其疏密,而木之性日以离矣。虽曰爱之,其实害之;虽曰忧之,其实仇之,故不我若也,吾又何能为哉?”
相传郭橐驼又在种树了,他沿着一条笔直的马路种了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
Sample Input
2 1 2 4611686018427387904 -4611686018427387904
Sample Output
1 9223372036854775808
在看到其他解答之前并不知道什么long long的范围 以为看到那么长串的数字得用字符串计算了。
于是兴高采烈地码了一大段 调试了半天。
但是并不知道为什么过不了 。。
#include<stdio.h>
#include<string.h>
#define N 20
int main()
{
int n;
scanf("%d",&n);getchar();
for(int j=0;j<n;j++){
char s1[N],s2[N];
int a[N]={0},b[N]={0},m,n,len,c[N]={0},f2=1,f1=1;//f1,f2代表两个数的符号
scanf("%s",&s1);scanf("%s",&s2);
m=strlen(s1);n=strlen(s2);
if(s2[0]=='-') {for(int i=0;i<n-1;i++) {s2[i]=s2[i+1];f2=0;s2[i+1]='\0';} n--;} //去掉符号
if(s1[0]=='-') {for(int i=0;i<m-1;i++) {s1[i]=s1[i+1];f1=0;s1[i+1]='\0';} m--;}
len=m>n?m:n;//长度
for(int i=0;i<n;i++)
b[i]=s2[n-1-i]-'0';//把数字赋到数组中比赋到字符串中方便多了 当时纠结了半天
for(int i=0;i<m;i++)
a[i]=s1[m-1-i]-'0';
if(f1!=f2){ //符号不同 绝对值相加
for(int i=0;i<len;i++)
{
b[i]+=a[i];
if(b[i]>=10)
{b[i]-=10;b[i+1]+=1;}
}
if(b[len]==1) len++;
for(int i=len-1;i>=0;i--)
c[i]=b[len-1-i];
for(int i=0;i<len;i++)
printf("%d",c[i]);
printf("\n");
}
else{//符号相同 绝对值相减
int A=0;
for(int i=len-1;i>=0;i--)//判断大小
{
if(a[i]==b[i]) continue;
if(a[i]>b[i]) {A=1;break;} //a>b
if(a[i]<b[i]) {A=0;break;}
}
if(A==0){//如果a<b就交换a,b.
int temp[len];
for(int i=0;i<len-1;i++)
{
temp[i]=b[i];
b[i]=a[i];
a[i]=temp[i];
}
a[n]='\0';b[m]='\0';
}
for(int i=0;i<len;i++)
{
/*if(A==0){ //b-a
b[i]-=a[i];
if(b[i]<0)
{b[i]+=10;b[i+1]-=1;}//b[i+2]='\0';}
}*/
// else{ //a-b
a[i]=a[i]-b[i];
if(a[i]<0)
{a[i]+=10;a[i+1]-=1;}
}
for(int i=len-1;i>=0;i--)
{
c[i]=(A=0?b[len-1-i]:a[len-1-i]);
}
while(c[0]==0)//去掉数字前边的0
{
len--;
for(int i=0;i<len;i++)
c[i]=c[i+1];
}
for(int i=0;i<len;i++)
printf("%d",c[i]);
printf("\n");
}
}
}