题目大意:主要是问,给定的两个整数点,这两个点所连成的直线之间是否存在其余的整数坐标,若存在则输出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");
}
}
}
实在不解为什么枚举的方法是错在哪了呢?