zzuli 1627大整数减法

大整数减法

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;
}

 

 

 


 

 

你可能感兴趣的:(zzuli 1627大整数减法)