何为格点?

横纵坐标均为整数的点,可以将坐标面看做一个二维表,线段即两个点为顶点的矩形的对角线,线段由格点组成

问题:

给定平面上的两个格点2以外一共有多少格点

方法1:

虽然可以用穷举法,遍历)

方法2:

0时,答案为0)

原因,首先看一下

通过上图可以看出,大矩形的对角线正好经过 (2,3),(4,6),(6,9) 除开(6,9),就是本体所要求的点。这就是为什么这个题的答案是|的最大公约数减去1。

数学:

那这个题可以转换为求最大公约数的问题,最大公约数一般使用辗转相除法

辗转相除法的原理: 
如果有两个自然数a和b(0, 那么gcd(a,b)=gcd(b,c)

下面提供了3个求最大公约数的方法(顺便一提,a和b的最小公倍数为)

#include <iostream>
#include <cmath>
using namespace std;
///非递归的方法
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;
}

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=0;i<=g;i++)///0时起点 g时终点;这是一个由起点按一定跨度,一步步到达终点的过程
    {
        cout<<"("<<x1+i*x_step<<","<<y1+i*y_step<<")"<<endl;
    }
}

 

相关文章:

  • 2022-01-06
  • 2022-01-09
  • 2022-01-20
  • 2021-12-09
  • 2022-02-07
猜你喜欢
  • 2022-12-23
  • 2021-12-07
  • 2022-12-23
  • 2022-01-31
  • 2021-06-26
  • 2021-06-20
  • 2021-12-04
相关资源
相似解决方案