题目:
现有一张半径为R的圆桌,其中心位于(X,Y),现在想把圆桌的中心移到(X1,Y1)。每次移动一步,都必须在圆桌边缘固定一个点然后将圆桌绕该点旋转,问最少需要几步?
输入:
3
1,1
3,3
输出:
1
注解:
float 浮点数与零值0比较
float x;
千万不要写x==0;
float x 与“零值”比较的 if 语句:
const float EPSINON = 0.00001;
if ((x >= - EPSINON) && (x <= EPSINON)
不可将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”此类形式。
EPSINON 应该是一个很小的值吧 因为计算机在处理浮点数的时候是有误差的,所以判断两个浮点数是不是相同,是要判断是不是落在同一个区间的,这个区间就是 [-EPSINON,EPSINON] EPSINON一般很小,10的-6次方以下吧,具体的好像不确定的,和机器有关
引用:
http://topic.csdn.net/t/20041126/10/3590118.html
结论:
还是那句话:浮点数都是有精度限制的。
所以你存的数,不一定就是你要的数。
关于EPSILON,可不是能随便定义的!
而且应该能想到,double和float的EPSINON是不同的。
定义成什么呢?不必你去定义了,查看include文件,在float.h头文件中有很多关于浮点数的宏定义:
#define FLT_EPSILON 1.19209290E-07F
#define LDBL_EPSILON 1.084202172485504E-19
我们自己定义FLT_EPSILON一般定义为
const int FLT_EPSILON=1e-6;
代码:
#include <iostream>
#include <stdio.h>
#include <math.h>
int main()
{
int R, X, Y;
int x1, y1,result=0;
float temp;
scanf_s("%d", &R);
scanf_s("%d,%d", &X, &Y);
scanf_s("%d,%d", &x1, &y1);
temp = sqrt((x1 - X) ^ 2 + (y1 - Y) ^ 2);
while (temp >= -FLT_EPSILON)
{
if ((x1 == X) && (y1 == Y))
{
break;
}
temp = temp - (2 * R);
result++;
}
printf("%d", result);
return 0;
}