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