算法小白——圆心位移

题目:

现有一张半径为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;
}
发布了28 篇原创文章 · 获赞 13 · 访问量 7041

猜你喜欢

转载自blog.csdn.net/weixin_44076906/article/details/104340745