【hdu】1577 WisKey的眼神(两个点之间是否存在整数坐标)

题目大意:主要是问,给定的两个整数点,这两个点所连成的直线之间是否存在其余的整数坐标,若存在则输出No,若不存在则输出Yes。

这边的话原来是采用枚举的方式,但是不知道是错在何处,主要方法是求出一般的直线方程,枚举其中的横坐标,判断纵坐标是否为整数即可(待思考)

正确的方法是:只要横坐标之差x,纵坐标之差y不存在公约数,即Yes,若存在输出No。

求最大公约数代码:

int gao(int x,int y)//x>y
{
	if (y == 0)return x;
	return gao(y, x%y);
}
证明:架设存在最大公约数k,那么可以知道,可以将横坐标平分k份,每份为x/k,纵坐标平分k份,每份y/k,相交点为(tx/k,ty/k),易得斜率为y/x与直线斜率相等,所以位于原来的直线上(k!=1时);

#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;
int abs(int a)
{
	if (a < 0)
		return -a;
	return a;
}
int gao(int x,int y)
{
	if (y == 0)return x;
	return gao(y, x%y);
}
int main()
{
	int a;
	int b;
	int l, sx, sy, px, py;
	while (scanf("%d",&l),  l)
	{
		scanf("%d%d%d%d", &sx, &sy, &px, &py);
		a = abs(px);
		b = abs(py);
		if (a >l || b > l)
		{
			puts("Out Of Range");

		}
		else
		{
			if (gao(max(abs(sx - px), abs(py - sy)),min(abs(sx - px), abs(py - sy))) == 1)
				puts("Yes");
			else puts("No");

		}
	}
}

实在不解为什么枚举的方法是错在哪了呢?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值