#include<bits/stdc++.h>
using namespace std;
辗转相除法
如
A%B=C+D
A=B*C+D
如果C为0则A与B的最大公约数为B
整除B*C和D能整除A
如E能整除 则(B*C)%E=0 D%E=0;
两数相加也能整除(B*C+D)%E也是0 则E是最大公约数
再用B替换A位置D替换B位置重复一直到余数为0则除数为最大公约数。
int gcd(int m,int n)
{
if(m%n==0)
{
return n;
}
gcd(n,m%n);
}
int main()
{
int a,b,c,d;
cin>>a>>b>>c>>d;
int m=gcd(abs(a-c),abs(b-d));
int e=abs(a-c)/m;
int f=abs(b-d)/m;
if(a<c&&b<d)
{
a+=e;b+=f;
while(a<c&&b<d)
{
cout<<a<<" "<<b<<endl;
a+=e;b+=f;
}
}
if(a<c&&b>d)
{
a+=e;b-=f;
while(a<c&&b>d)
{
cout<<a<<" "<<b<<endl;
a+=e;b-=f;
}
}
if(a>c&&b<d)
{
a-=e; b+=f;
while(a>c&&b<d)
{
cout<<a<<" "<<b<<endl;
a-=e; b+=f;
}
}
if(a>c&&b>d)
{
a-=e; b-=f;
while(a>c&&b>d)
{
cout<<a<<" "<<b<<endl;
a-=e; b-=f;
}
}
return 0;
}