NYOJ 524 & HDU 2054 A==B?(模拟)

题目链接:Click here~~

还是一道模拟题。

和上次的A+B四类似,先记录每个数字的符号,然后把符号去掉,处理每个数字的前缀0和后缀0,然后比较。

需要注意的是:

1、删前缀0的时候,整数必须保留一位。

2、只有小数才删后缀0。

3、注意+0 == -0。

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
const int M=100000;
void back(char* c,int &l)
{
    if(strchr(c,'.') == NULL)           //整数不用处理后缀
        return ;
    for(int i=l-1;i>=1;i--)             //删除后缀0
    {
        if(c[i]!='0')
            break;
        l--;
    }
    if(c[l-1]=='.')
        l--;
    c[l]='\0';
    //puts("after back->");
    //puts(c);
}
void front(char* c,int &l,bool &f)
{
    int cnt = isdigit(c[0]) ? 0 : 1;    //cnt记录前缀0和符号的个数
    if(c[0]=='-')
        f = false;
    for(int i=cnt;i<l-1;i++)            //l-1保证c为整数时留一位整数
    {
        if(c[i+1]=='.' || c[i]!='0')    //c[i+1]=='.'保证c为小数时留一位整数
            break;
        cnt++;
    }
    if(cnt)
    {
        for(int i=0;i<l-cnt;i++)        //把字符串整体向前移cnt位
            c[i] = c[i+cnt];
        c[l-cnt] = '\0';
    }
    //puts("after front->");
    //printf(f?"+ ":"- ");
    //puts(c);
}
void deal(char *c,bool &f)
{
    int l = strlen(c);
    f = true;                           //f记录符号,初始为正
    back(c,l);
    front(c,l,f);
}
bool Cmp(char* A,char* B,bool a,bool b)
{
    if(strcmp(A,B) == 0)
    {
        if(strcmp(A,"0") == 0 || a^b == 0)
            return true;
    }
    return false;
}
int main()
{
    char A[M],B[M];
    bool a,b;
    while(~scanf("%s%s",A,B))
    {
        deal(A,a);
        deal(B,b);
        puts(Cmp(A,B,a,b)?"YES":"NO");
    }

    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值