HDOJ 2054 A == B ?(大数)

A == B ?

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 98202    Accepted Submission(s): 15578


Problem Description

Give you two numbers A and B, if A is equal to B, you should print "YES", or print "NO".

 


Input

each test case contains two numbers A and B.

 


Output

for each case, if A is equal to B, you should print "YES", or print "NO".

 


Sample Input

 
 
1 2 2 2 3 3 4 3

 


Sample Output

 
 
NO YES YES NO

#include<stdio.h>
#include<string.h>
char a[100001],b[100001];
int main()
{
    int i,j,flag,flag1,flag2,temp1,temp2,s1,s2,len1,len2,t1,t2;
    while(~scanf("%s%s",a,b))
    {
        len1=strlen(a);
        len2=strlen(b);
        flag1=flag2=s1=s2=0;
        if(a[0]=='-')
        {
            flag1=1;
            s1++;
        }
        else if(a[0]=='+')
            s1++;
        if(b[0]=='-')
        {
            flag2=1;
            s2++;
        }
        else if(b[0]=='+')
            s2++;
        for(;a[s1]=='0';s1++)   //去掉前导0
            a[s1]='!';
        for(;b[s2]=='0';s2++)
            b[s2]='!';
        temp1=temp2=0;
        for(i=s1;i<len1;i++)    //判断有无小数点
        if(a[i]=='.')
        {
            temp1=1;
            break;
        }
        for(i=s2;i<len2;i++)
        if(b[i]=='.')
        {
            temp2=1;
            break;
        }
        t1=len1-1;
        t2=len2-1;
        if(temp1)               //去掉后导0
            for(;a[t1]=='0';t1--)
                a[t1]='!';
        if(a[t1]=='.')          //去掉不必要的小数点
        {
            a[t1]='!';
            t1--;
        }
        if(temp2)
            for(;b[t2]=='0';t2--)
                b[t2]='!';
        if(b[t2]=='.')
        {
            b[t2]='!';
            t2--;
        }
        if((t1-s1)!=(t2-s2))    //判断转化后的数字长度是否一致
            printf("NO\n");
        else if(t1==(s1-1)&&t2==(s2-1))     //正负0的情况
            printf("YES\n");
        else if(flag1!=flag2)       //符号相反
            printf("NO\n");
        else
        {
            flag=1;
            for(i=s1,j=s2;i<=t1;i++,j++)     //逐位比较
            if(a[i]!=b[j])
            {
                flag=0;
                break;
            }
            if(flag)    printf("YES\n");
            else    printf("NO\n");
        }
    }
    return 0;
}

几组特殊的测试数据:

12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
YES
00000000000000000002222 2222
YES
200 200000
NO
0.00002 0.000020000000000000000000000000000000
YES
00000000000000000000.00002 0.0000200000
YES
0022000 000000000002200
YES
-0022.00200 -000000000000022.002000000000000000000
YES
+0.00 0.000000000000000
YES
000000000 0000000000000
YES
000001.00000 1
YES
-0001.000 0001
NO
-0 0
YES


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值