1182: a-b
时间限制: 10 Sec 内存限制: 128 MB提交: 490 解决: 196
[ 提交][ 状态][ 讨论版]
题目描述
求a-b的值
输入
第一行一个整数T,表示接下来有T行
每行两个整数是a,b,(0<=a,b<=10^10000)
输出
输出值
样例输入
2
100
98100000000000000000000 1
样例输出
2
99999999999999999999
提示
来源
心得:1、一开始按照大数相加的思路来的,后来发现不完全一样,相减之后的长度一定要小于减数里面最长的,
所以不用另外设数组,还用原来的最长的数组就好了。
2、要分情况考虑,第一、两个数组长度形同,可以是两个数组完全一样,结果为0,否则相减;
第二、减数较长,结果为正数,减数作为结果数组;
第三、被减数较长,结果为负,被减数作为结果数组。
3、如果数组位数为负值,要借位。
代码如下:
#include<bits/stdc++.h>
using namespace std;char a[10001];
char b[10001];
char* jf(char a[],int l1,char b[],int l2)
{
int i,j;
for(i=l1-1,j=l2-1;i>=0;i--,j--)
{
if(j>=0) a[i]=a[i]-b[j]+'0';
else if(j<0) a[i]=a[i];
if(a[i]<'0') a[i]=a[i]+10,a[i-1]--;
}
return a;
}
int main(void)
{
int n,i,t,j;
scanf("%d",&t);
while(t--)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
scanf("%s %s",a,b);
int l1=strlen(a),l2=strlen(b),fg=0;
if(l1>l2) jf(a,l1,b,l2);
else if(l1<l2) jf(b,l2,a,l1),fg=1;
else if(l1==l2)
{
if(strcmp(a,b)==0)
{
printf("0\n");
continue;
}
else if(strcmp(a,b)<0) jf(b,l2,a,l1),fg=1;
else if(strcmp(a,b)>0) jf(a,l1,b,l2);
}
if(fg)
{
printf("-");i=0;
while(b[i]=='0'){
i++;
}
for(;i<l2;i++) printf("%c",b[i]);
printf("\n");
}
else
{
i=0;
while(a[i]=='0'){
i++;
}
for(;i<l1;i++) printf("%c",a[i]);
printf("\n");
}
}
return 0;
}