标签:最大公约数-最大格点
给定平面上的两个格点
虽然可以用穷举法,遍历
原因,首先看一下
通过上图可以看出,大矩形的对角线正好经过 (2,3),(4,6),(6,9) 除开(6,9),就是本体所要求的点。这就是为什么这个题的答案是
那这个题可以转换为求最大公约数的问题,最大公约数一般使用辗转相除法
辗转想法的原理:
如果有两个自然数a和b(
情况1:如果
情况2:如果
下面提供了3个求最大公约数的方法(顺便一提,a和b的最大公倍数为
#include <iostream>
#include <cmath>
using namespace std;
int gcd1(int,int);
int gcd2(int,int);
int gcd3(int,int);
int main(void)
{
int x1,x2,y1,y2;
cout<<"input x1,y1,x2,y2"<<endl;
cin>>x1>>y1>>x2>>y2;
int abs_x=abs(x1-x2);
int abs_y=abs(y1-y2);
int g=gcd3(abs_x,abs_y);
cout<<g-1<<endl;
int x_step=(x2-x1)/g;
int y_step=(y2-y1)/g;
for(int i=1;i<g;i++)
{
cout<<"("<<x1+i*x_step<<","<<y1+i*y_step<<")"<<endl;
}
}
//非递归的方法
int gcd1(int a,int b)
{
int c;
do
{
c=a%b;
a=b;
b=c;
}while(c!=0);
return a;
}
//递归的方法
int gcd2(int a,int b)
{
if(b == 0){
return a;
}else{
return gcd2(b,a%b);
}
}
//辗转相减法
int gcd3(int a,int b)
{
int c=a-b;
if(c<0){
return gcd3(b,a);
}
while((a-b)!=0)
{
a=a-b;
if(a<b){
int tmp=a;
a=b;
b=tmp;
}
}
return a;
}
标签:最大公约数-最大格点
原文地址:http://blog.csdn.net/lizo_is_me/article/details/43670263