线段上格点的个数
给定平面上两个格点
P1=(x1,y1)和
P2=(x2,y2),线段P1P2上,除P1和P2之外一共又几个格点?html
限制条件web
-
−109≤x1,x2,y1,y2≤109
输入app
P1 = (1,11),P2 = (5,3)
输出svg
(2,9)、(3,7)、(四、5)
答案是
∣x1−x2∣和
∣y1−y2∣的最大公约数-1(当作一个结论来记吧,我也不知道咋来的)
主题函数
计算最大公约数——展转相除法
设
gcd(a,b)是计算天然数a和b的最大公约数的函数,a除以b获得的商和余数分别为p和q。由于
a=b×p−q,因此
gcd(b,q)既整除a又整除b(假设
gcd(b.q)求得的结果记做r,即b与q的最大公约数是r,便可表示为
b%r==0,q%r==0),又
a=b×p−q,因此
a÷r==rb×p−q→rb×p−rq,因此得出
gcd(b.q)的结果既能整除a又能整除b,也就能整除
gcd(a,b)。反之,由于
q=a−b×p,同理可证
gcd(a,b)整除
gcd(b,q)。所以能够知道
gcd(a,b)==gcd(b,a%b)。不断这样操做下去,因为gcd的第二个参数老是不断缩小的,最终会获得
gcd(a,b)==gcd(c,0)。0和c的最大公约数是c,因此
gcd(c,0)==c,这样就计算出了
gcd(a,b)。程序实现以下:
spa
int gcd(int a,int b)
{
if(b==0) return a;
return gcd(b,a%b);
}
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}