524.A-B Problem
时间限制:1000 ms | 内存限制:65535 KB难度:3
描述
A+B问题早已经被大家所熟知了,是不是很无聊呢?现在大家来做一下A-B吧。
现在有两个实数A和B,聪明的你,能不能判断出A-B的值是否等于0呢?
输入
有多组测试数据。每组数据包括两行,分别代表A和B。
它们的位数小于100,且每个数字前中可能包含+,- 号。
每个数字前面和后面都可能有多余的0。
每组测试数据后有一空行。
输出
对于每组数据,输出一行。
如果A-B=0,输出YES,否则输出NO。
样例输入
1
1
1.0
2.0
样例输出
YES
NO
-----------------------------------------------------------------------------------------------------------
这又是NYOJ里一道分类为大数问题的题目,一种做法是写出两个大数相减的算法,因为仅要求比较大小,这里仅仅进行了字符串比较
#include <stdio.h>
#include <string.h>
int main(){
char s[2][110]={0},*p[2],n[2],i,j,k,r;
while(~scanf("%s %s",s[0],s[1])){
for(i=0;i<2;i++){
j=0;//指示数字非符号位开始的位数
n[i]=1;
r=s[i][0];
if(r=='+')//如果有符号,则j=1
j=1;
else if(r=='-'){
j=1;
n[i]=-1;//n[i]=-1表示负数,1表示正数
}
while(s[i][j]=='0') j++;//找到第一个非零位
p[i]=&s[i][j];
if(strstr(s[i],".")){//查找小数点
k=strlen(s[i])-1;
while(s[i][k]=='0') s[i][k--]=0;//找到小数部分从右往左第一个非零位,并将为0的位赋值为'\0'
if(s[i][k]=='.')//如果小数部分全为0,则将小数点改为字符串结束字符
s[i][k]=0;
}
}
r=0;
if(!p[0][0] && !p[1][0])//如果整数小数部分均为0,则此时两个字符串均为空字符串,+0和-0输入解决了
r=1;
else if(!strcmp(p[0],p[1]) && n[0]*n[1]>0)//字符串相等且同号
r=1;
printf("%s\n",r?"YES":"NO");
}
return 0;
}