大整数减法
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;
}