A == B?

  • [1049] A == B ?

  • 时间限制: 1000 ms 内存限制: 65535 K
  • 问题描述
  • 这道题目很简单,就是判断浮点数a,b是否相等。
  • 输入
  • 第一行输入一个整数n,代表数据组数,当n不为正的时候结束输入。
    接下来n行,每行输入两个浮点数a,b。
    对于每个输入的小数,取小数点后5位。
  • 输出
  • 若a 等于 b 是则输出YES,否则输出NO。
    对于每一组的a,b数据输出编号,每组数据用空行分隔。
    详情见样例输出。
  • 样例输入
  • 2
    1 2
    2.3 2.3
    1
    1.0 1.0
    0
    
  • 样例输出
  • CASE# 1 : NO
    CASE# 2 : YES
    
    CASE# 1 : YES
    
  • 提示
  • 来源
  • monkeyde17
  • 操作
  •        


首先不得不说这真的是一道很恶心的模拟题,因为想不出什么更简单的方法,所以认真考虑了各种情况来模拟的,包括正负、前导0,小数点的有无,小数点之前有没有数,小数点之后有效位数不足五位等等,然后还因为输出格式PE三次,要注意题面上说的n不为正就结束!不为正就结束!不为正就结束!重要的事情说三遍,不是不为0结束。

AC代码如下:

#include"cstdio"
#include"cstring"
#include"iostream"
#include"algorithm"

using namespace std;

char a[1005],b[1005];
char aa[1005],bb[1005];

bool is_nummber(char c)
{
    if(c >= '0' && c <= '9')
    {
        return true;
    }
    return false;
}

int main()
{
    int n;
    bool f = false;
    while(~scanf("%d",&n))
    {
        if(f && n > 0) puts("");
        if(n <= 0) break;
        f = true;
        for(int cas = 1;cas <= n;cas++)
        {
            bool flag = true; //预处理为相等
            scanf("%s%s",a,b);
            if((a[0] == '-' && b[0] != '-')||(a[0] != '-' && b[0] == '-'))
            //要表示输入的为负数,那么肯定要输入负号,如果只有一个有负号,那么肯定不等
            {
                flag = false;
            }
            else
            {
                if(!is_nummber(a[0])) //第一位为符号的话就变为前导0
                {
                    a[0] = '0';
                }
                if(!is_nummber(b[0])) //同上
                {
                    b[0] = '0';
                }
                int p = -1,q = -1; //前导0截止位置
                int pos1 = -1,pos2 = -1; //小数点位置
                int la = strlen(a);
                int lb = strlen(b);
                bool fg = true;
                for(int i = 0;i < la;i++)
                {
                    if(fg && a[i] != '0') //找到前导0截止位置
                    {
                        fg = false;
                        p = i;
                    }
                    if(a[i] == '.') //找到小数点位置
                    {
                        pos1 = i;
                        break;
                    }
                }
                fg = true;
                for(int i = 0;i < lb;i++)
                {
                    if(fg && b[i] != '0') //找到前导0截止位置
                    {
                        fg = false;
                        q = i;
                    }
                    if(b[i] == '.') //找到小数点位置
                    {
                        pos2 = i;
                        break;
                    }
                }

                //以下处理数组a
                if(p == -1) //没有前导0
                {
                    if(pos1 == -1) //没有小数点
                    {
                        int i;
                        for(i = 0;i < la;i++)
                        {
                            aa[i] = a[i];
                        }
                        aa[i++] = '.';
                        int t = 5;
                        while(t--)
                        {
                            aa[i++] = '0';
                        }
                        aa[i] = '\0';
                    }
                    else if(pos1 == 0) //第一位为小数点
                    {
                        aa[0] = '0';
                        int cnt = 1;
                        for(int i = pos1;i <= pos1 + 5;i++)
                        {
                            if(a[i] == '\0')
                            {
                                int loc = pos1 + 6 - i;
                                while(loc--)
                                {
                                    aa[cnt++] = '0';
                                }
                                break;
                            }
                            else
                            {
                                aa[cnt++] = a[i];
                            }
                        }
                        aa[cnt] = '\0';
                    }
                    else //没有前导0没有小数点且小数点不在第一位
                    {
                        int cnt = 0;
                        for(int i = 0;i <= pos1 + 5;i++)
                        {
                            if(a[i] == '\0')
                            {
                                int loc = pos1 + 6 - i;
                                while(loc--)
                                {
                                    aa[cnt++] = '0';
                                }
                                break;
                            }
                            else
                            {
                                aa[cnt++] = a[i];
                            }
                        }
                        aa[cnt] = '\0';
                    }
                }
                else //有前导0
                {
                    if(pos1 == -1) //没有小数点
                    {
                        int cnt = 0;
                        for(int i = p;i < la;i++)
                        {
                            aa[cnt++] = a[i];
                        }
                        aa[cnt++] = '.';
                        int t = 5;
                        while(t--)
                        {
                            aa[cnt++] = '0';
                        }
                        aa[cnt] = '\0';
                    }
                    else //有小数点
                    {
                        if(pos1 == p) //前导0截止位置和小数点位置相同
                        {
                            int cnt = 1;
                            aa[0] = '0';
                            for(int i = pos1;i <= pos1 + 5;i++)
                            {
                                if(a[i] == '\0')
                                {
                                     int loc = pos1 + 6 - i;
                                     while(loc--)
                                     {
                                         aa[cnt++] = '0';
                                     }
                                     break;
                                }
                                aa[cnt++] = a[i];
                            }
                            aa[cnt] = '\0';
                        }
                        else //前导0截止位置和小数点位置不同
                        {
                            int i;
                            int cnt = 0;
                            for(i = p;i <= pos1+5;i++)
                            {
                                if(a[i] == '\0')
                                {
                                     int loc = pos1 + 6 - i;
                                     while(loc--)
                                     {
                                         aa[cnt++] = '0';
                                     }
                                     break;
                                }
                                aa[cnt++] = a[i];
                            }
                            aa[cnt] = '\0';
                        }
                    }
                }

                //以下处理数组b
                if(q == -1) //没有前导0
                {
                    if(pos2 == -1) //没有小数点
                    {
                        int i;
                        for(i = 0;i < lb;i++)
                        {
                            bb[i] = b[i];
                        }
                        bb[i++] = '.';
                        int t = 5;
                        while(t--)
                        {
                            bb[i++] = '0';
                        }
                        bb[i] = '\0';
                    }
                    else if(pos2 == 0) //第一位为小数点
                    {
                        bb[0] = '0';
                        int cnt = 1;
                        for(int i = pos2;i <= pos2 + 5;i++)
                        {
                            if(b[i] == '\0')
                            {
                                int loc = pos2 + 6 - i;
                                while(loc--)
                                {
                                    bb[cnt++] = '0';
                                }
                                break;
                            }
                            else
                            {
                                bb[cnt++] = b[i];
                            }
                        }
                        bb[cnt] = '\0';
                    }
                    else //没有前导0没有小数点且小数点不在第一位
                    {
                        int cnt = 0;
                        for(int i = 0;i <= pos2 + 5;i++)
                        {
                            if(b[i] == '\0')
                            {
                                int loc = pos2 + 6 - i;
                                while(loc--)
                                {
                                    bb[cnt++] = '0';
                                }
                                break;
                            }
                            else
                            {
                                bb[cnt++] = b[i];
                            }
                        }
                        bb[cnt] = '\0';
                    }
                }
                else //有前导0
                {
                    if(pos2 == -1) //没有小数点
                    {
                        int cnt = 0;
                        for(int i = q;i < lb;i++)
                        {
                            bb[cnt++] = b[i];
                        }
                        bb[cnt++] = '.';
                        int t = 5;
                        while(t--)
                        {
                            bb[cnt++] = '0';
                        }
                        bb[cnt] = '\0';
                    }
                    else //有小数点
                    {
                        if(pos2 == q) //前导0截止位置和小数点位置相同
                        {
                            int cnt = 1;
                            bb[0] = '0';
                            for(int i = pos2;i <= pos2 + 5;i++)
                            {
                                if(b[i] == '\0')
                                {
                                     int loc = pos2 + 6 - i;
                                     while(loc--)
                                     {
                                         bb[cnt++] = '0';
                                     }
                                     break;
                                }
                                bb[cnt++] = b[i];
                            }
                            bb[cnt] = '\0';
                        }
                        else //前导0截止位置和小数点位置不同
                        {
                            int i;
                            int cnt = 0;
                            for(i = q;i <= pos2+5;i++)
                            {
                                if(b[i] == '\0')
                                {
                                     int loc = pos2 + 6 - i;
                                     while(loc--)
                                     {
                                         bb[cnt++] = '0';
                                     }
                                     break;
                                }
                                bb[cnt++] = b[i];
                            }
                            bb[cnt] = '\0';
                        }
                    }
                }
           //结果比较
                if(strcmp(aa,bb) != 0)
                {
                    flag = false;
                }
            }
            printf("CASE# %d : ",cas);
            if(flag)
            {
                puts("YES");
            }
            else
            {
                puts("NO");
            }
            /*if(cas == n)
            {
                printf("\n");
            }*/
        }
    }
    return 0;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值