原创作品 转载请注明出处http://blog.csdn.net/always2015/article/details/45556755
尼玛,这道题刚看的时候觉得太简单了,一会写了几行判断相等的代码,而且直接用a==b判断,提交时候就傻逼了,怎么也AC不了。原来这一道题确实是有点难度的,主要是在输入的数字中不一定是规则的数字,所以要考虑的情况有好几种。主要是考虑小数中末尾的0,如5.0和5.00是相等的数,所以输入的数据类型最好定义成字符串,然后在比较两个数前先把末尾的0去掉。另外,题目上没给具体的数值类型,所以要开一个很大的字符数组。
1)前面的无效0去掉
2)小数点后面的无效0去掉
3)-0=0
4)可以去掉的话,最好去掉小数点
我的代码如下:
#include <iostream>
#include<string.h>
using namespace std;
//对数字进行统一处理,返回数字第一位不为0的位置
int change_char(char *letter,int *len)
{
int i=0;
int len_var=(*len)-1;
//如果是符号,则跳过
if(letter[i]=='-')
{
++i;
--(*len);
}
//去掉前面的0
while(letter[i]=='0'&&i<=len_var)
{
--(*len);
++i;
}
//去掉小数点之后最后无效的0,从最后一位算起
for(int j=0; j<=len_var; j++)
{
if(letter[j]=='.')
{
while(letter[len_var]=='0'&&len_var>=0)
{
--(*len);
--len_var;
}
break;
}
}
//如果小数点后面都是无效的0.则去掉小数点
if(letter[len_var]=='.')
--(*len);
return i;
}
int main()
{
char a[100000],b[100000];
int symbol_flag,lenght_a,lenght_b,pos_char_a,pos_char_b,out_flag=1;
while(cin>>a>>b)
{
/*当两者符号不一样的时候做一个标志,
因为存在-0=0这种情况,所以当符号不一样不能直接下定论两者不相等
*/
if(a[0]=='-'&&b[0]!='-' || a[0]!='-'&&b[0]=='-')
symbol_flag=1;
//求出a,b长度
lenght_a=strlen(a);
lenght_b=strlen(b);
//求出第一位不为0的数的位置
pos_char_a= change_char(a,&lenght_a);
pos_char_b= change_char(b,&lenght_b);
//当两者的有效位数不一样直接是不相等,注意下面几个continue的作用
if(lenght_a!=lenght_b)
{
cout<<"NO"<<endl;
continue;
}
//以下几个语句都是在lenght_a=lenght_b才执行的
if(symbol_flag==1&&lenght_a==0)
{
cout<<"YES"<<endl;
continue;
}
//当符号不一样,且lenght_a或者lenght_b都不为0时候是不相等的
if(symbol_flag==1)
{
cout<<"NO"<<endl;
continue;
}
//当符号一样,长度相等执行下面语句,从有效长度起始位置开始判断各位是否相等
for(int i=pos_char_a,j=pos_char_b; i<lenght_a; i++,j++)
{
if(a[i]!=b[j])
{
cout<<"NO"<<endl;
out_flag=0;
break;
}
}
if(out_flag==1)
cout<<"YES"<<endl;
//从新初始化
out_flag=1;
}
return 0;
}