题目描述
给定平面上的两个格点P1=(x1,y1)和P2=(x2,y2),线段P1P2上,除P1和P2以外一共有几个格点并打印出格点坐标?
限制条件:-1000000000<=x1,y1,x2,y2<=1000000000
输入
P1=(1,11),P2=(5,3)
输出
(2,9)、(3,7)、(4,5)三个点
注:格点是指横纵坐标均为整数的点。
gcd(abs(p1x-p2x),abs(p1y-p2y))
Δy/Δx 求出的Δy/Δx可整除gcd 按比例减小或增大 即为其点
int gcd(int a,int b){
if(b==0)
return a;
else
return gcd(b,a%b);
}
高效辗转相除法的递归形式
#include <cstdio>
#include <iostream>
using namespace std;
int gcd(int a,int b){
if(b==0)
return a;
else
return gcd(b,a%b);
}
int main(){
int p1[3],p2[3],x,y,a,b,c,d;
scanf("%d%d%d%d",&p1[1],&p1[2],&p2[1],&p2[2]);
a=x=p2[2]-p1[2];
b=y=p2[1]-p1[1];
if(x<0) x=-x;
if(y<0) y=-y;
c=(p1[1]-p2[1])/gcd(x,y);
d=(p1[2]-p2[2])/gcd(x,y);
int ans=gcd(x,y)-1;
while(ans--){
p1[1]-=c;
p1[2]-=d;
printf("(%d,%d)\n",p1[1],p1[2]);
}
return 0;
}