`
lovnet
  • 浏览: 6704201 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

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


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics