#include<stdio.h>
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}
int min(int a,int b)
{
return a>b?b:a;
}
int max(int a,int b)
{
return a>b?a:b;
}
int miners(int a,int b)
{
return (a-b>0)?(a-b):(b-a);
}
int main()
{
int x1,y1,x2,y2;
while (~scanf("%d%d%d%d",&x1,&y1,&x2,&y2))
{
int gcd_x=miners(x1,x2)/gcd(miners(x1,x2),miners(y1,y2)),x;
int gcd_y=miners(y1,y2)/gcd(miners(x1,x2),miners(y1,y2)),y;
//printf("~~~%d~~~\n",gcd_x);
//printf("~~~%d~~~\n",gcd_y);
if (x1==x2&&y1==y2)//两个点坐标相等,输出原来的点
printf("(%d,%d)\n",x1,y1);
else if (x1==x2)//斜率不存在时
{
x=x1,y=min(y1,y2)+1;
while (y<max(y1,y2))
{
printf("(%d,%d)\n",x,y);
y++;
}
}
else if (y1==y2)//斜率存在且为0时
{
x=min(x1,x2)+1,y=y1;
while (x<max(x1,x2))
{
printf("(%d,%d)\n",x,y);
x++;
}
}
if (x1<x2&&y1<y2)
{
x=x1+gcd_x,y=y1+gcd_y;
while (x<x2)
{
printf("(%d,%d)\n",x,y);
x+=gcd_x;
y+=gcd_y;
}
}
else if (x1<x2&&y1>y2)
{
x=x1+gcd_x,y=y1-gcd_y;
while (x<x2)
{
printf("(%d,%d)\n",x,y);
x+=gcd_x;
y-=gcd_y;
}
}
}
return 0;
}
挑战变成设计->2.6 数学问题的解题窍门->线段上格点的个数
最新推荐文章于 2020-10-03 16:57:20 发布
