A-B Problem
Accept:627 | Submit:5002 |
Time Limit:1000MS | Memory Limit:65536KB |
Description
Calculate A-B
Input
Two integer a and b(-10^100 < a,b < 10^100)
Output
Output a-b
Sample Input
1 2
Sample Output
-1
Source
BUPT Online Judge
Calculate A-B
Input
Two integer a and b(-10^100 < a,b < 10^100)
Output
Output a-b
Sample Input
1 2
Sample Output
-1
Source
BUPT Online Judge
/*
功能 Function Description: 大数 A-B
开发环境 Environment: DEV C++ 4.9.9.1
作者 Author: 可笑痴狂
日期 Date: 20120725
备注 Notes:
*/
#include<stdio.h>
#include<string.h>
#define MAX 110
char s1[MAX],s2[MAX],temp[MAX];
int a[MAX],b[MAX];
int len1,len2,i,j;
void add(char *s1,char *s2) //大整数加法
{
for(i=len1-1,j=0;i>=0;--i)
a[j++]=s1[i]-'0';
for(i=len2-1,j=0;i>=0;--i)
b[j++]=s2[i]-'0';
for(i=0;i<MAX;++i)
{
a[i]+=b[i];
if(a[i]>=10)
{
a[i]-=10;
++a[i+1];
}
}
}
int judge(char *s1,char *s2)//判断s1的绝对值是否大于s2,如果大于则返回1,小于则返回0
{
len1=strlen(s1);
len2=strlen(s2);
if(len1>len2)
return 1;
else if(len1==len2)
{
for(i=0;i<len1;++i)
{
if(s1[i]>s2[i])
return 1;
else
return 0;
}
}
else
return 0;
}
void sub(char *s1,char *s2)
{
len1=strlen(s1);//防止变换后len1与len2互换
len2=strlen(s2);
for(i=len1-1,j=0;i>=0;--i)
a[j++]=s1[i]-'0';
for(i=len2-1,j=0;i>=0;--i)
b[j++]=s2[i]-'0';
for(i=0;i<MAX;++i)
{
a[i]-=b[i];
if(a[i]<0)
{
a[i]+=10;
--a[i+1];
}
}
}
int main()
{
int flag;
while(scanf("%s%s",s1,s2)!=EOF)
{
if(strcmp(s1,s2)==0)//开始先排除0 的情况,以后不再判断
{
printf("0\n");
continue;
}
flag=0;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
len1=strlen(s1);
len2=strlen(s2);
if(s1[0]!='-'&&s2[0]=='-'||s1[0]=='-'&&s2[0]!='-') //情况一:A-(-B),等价于A+B 或者 情况二:-A-B,等价于-(A+B)
{
if(s1[0]=='-')
{
s1[0]='0';
flag=1;
}
if(s2[0]=='-')
s2[0]='0';//消去负号
add(s1,s2);
if(flag)
printf("-");
}
else //情况三:A-B 情况四:-A-(-B)等价于B-A
{
if(s1[0]=='-') //把情况四转化为情况三
{
s1[0]='0';
s2[0]='0';
strcpy(temp,s1);
strcpy(s1,s2);
strcpy(s2,temp);
}
if(judge(s1,s2))
sub(s1,s2);
else
{
printf("-");
sub(s2,s1);
}
}
for(i=MAX-1;i>=0&&a[i]==0;--i);
// if(i>=0) //屏蔽的代码可以烤炉0-(-0)的情况
// {
for(;i>=0;--i)
printf("%d",a[i]);
printf("\n");
// }
// else
// printf("0\n");
}
return 0;
}