您的位置:首页 > 其它

zzuli 1627大整数减法

2012-04-24 20:31 218 查看
大整数减法
Time Limit:1000MS Memory Limit:65536K

Total Submit:43 Accepted:14
Description

求两个不超过200 位的非负整数的差。

Input

首先输入一个整数n , 表示测试实例的个数。

每组实例输入两行,每行是一个不超过200 位的非负整数,没有多余的前导0。

Output

每组实例输出一行,即相减后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能

输出为0342。

Sample Input


1
33333333333333333333
22222222222222222222


Sample Output


11111111111111111111


Hint

结果可能为负数

//////////////

思想:

0000000

123

//逆置

0000000

321

//补加0

0000000

3210000

//逆置回来(做比较)

0000000

0000123

//逆置(存储)

0000123

0000000

//作差

0000123

//去掉前导0

123

////////////////

#include<stdio.h>

#include<string.h>

#define max 210

char s1[max],s2[max];

int a[max],b[max];

void clear()//进行初始化

{

memset(s1,0,sizeof(s1));

memset(s2,0,sizeof(s2));

memset(a,0,sizeof(a));

memset(b,0,sizeof(b));

}

int mmax(int x,int y)

{

return x>y?x:y;

}

int main()

{

int i,j,t,f,l1,l2,l;

scanf("%d",&t);

while(t--)

{

clear();

scanf("%s%s",s1,s2);

l1=strlen(s1);

l2=strlen(s2);

l=mmax(l1,l2);

strrev(s1);//逆置

strrev(s2);//逆置

if(l1<l)//补加0

{

for(i=l1;i<l;i++)

s1[i]='0';

s1[i]='\0';

}

else//补加0

{

for(i=l2;i<l;i++)

s2[i]='0';

s2[i]='\0';

}

strrev(s1);//逆置回来(做比较)

strrev(s2);//逆置回来(做比较)

if(strcmp(s1,s2)>0)//(做比较)

f=1;

else if(strcmp(s1,s2)==0)

{

printf("0\n");

continue;

}

else

f=0;

strrev(s1);//逆置(存储)

strrev(s2);//逆置(存储)

if(f)

{

for(i=0;i<l1;i++)

a[i]=s1[i]-'0';

for(i=0;i<l2;i++)

b[i]=s2[i]-'0';

}

else

{

printf("-");

for(i=0;i<l1;i++)

b[i]=s1[i]-'0';

for(i=0;i<l2;i++)

a[i]=s2[i]-'0';

}

for(i=0;i<205;i++)

{

a[i]=a[i]-b[i];

if(a[i]<0)

{

a[i]=a[i]+10;

a[i+1]--;

}

}

for(i=201;i>=0;i--)//去掉前导0

if(a[i]!=0)

break;

for(j=i;j>=0;j--)

printf("%d",a[j]);

printf("\n");

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: