这道题的坑就是容易把float和double混用,导致结果不对,起初我把sum和m(见下文代码)定义为float类型,而sum初始化的时候又用了sum=1.0/2;
结果导致在循环条件判断的时候double 和float进行大小比较,产生了错误的结果。最后我把m和sum都定义为double,就AC了。
而double 和float为什么不能比较原因如下:
看一下下面的代码:
#include <stdio.h>
int main()
{
float m;
scanf("%f",&m);
if(m<=0.8f)
printf("YES\n");
else
printf("NO\n");
}输入0.8时,输出的是NO
可见float和double 比较大小时也不能同日而语。
原因在于:
0.8f != 0.8 这个float 和 double 问题,就像10进制里面的 0.33333333 和 0.3333333333333333不相等一样。
而向 float 比较 0.8f == 0.8f 或 double 比较0.8 == 0.8 都是没问题的
0.8 在二进制的世界中是无法精确表示的。就如同 1/3.0 在十进制世界中无法精确表示一样。
其次, 0.8 是 double 浮点数常量,而 0.8f 才是 float 浮点数常量。
所以:0.8 != 0.8f
float f1 = 0.8;
float f2 = 0.8f;
double d1 = 0.8;
double d2 = 0.8f;
f1 == f2 == d2 != d1
同时加上一个小常识:
两个浮点数近似相等:a-b<1e-6
AC 代码
#include <iostream>
using namespace std;
int main()
{
//freopen("D:\\input.txt","r",stdin);
//freopen("D:\\output.txt","w",stdout);
double m;
cin>>m;
int i=1;
double sum=1.0/2;
while(m!=0.00)
{
sum=1.0/2;
i=1;
while(sum<m)
{
sum+=1.0/(i+2);
i++;
}
cout<<i<<' '<<"card(s)"<<endl;
cin>>m;
}
}
236

被折叠的 条评论
为什么被折叠?



