📜  C++ 程序在数组中查找给定索引范围的 GCD(1)

📅  最后修改于: 2023-12-03 14:59:49.437000             🧑  作者: Mango

C++ 程序在数组中查找给定索引范围的 GCD

本文介绍如何在 C++ 中使用 Euclidean算法 查找数组中给定索引范围的最大公约数 (GCD)。

算法介绍

先给大家介绍一下 Euclidean算法:

欧几里得算法,又称辗转相除法,是一种简单且古老的算法,用于计算两个正整数的最大公约数。具体操作为:用较大数除以较小数,再用除数除以出现的余数(第一次除法的除数),如此反复,直到出现的余数是0为止。而第一次为了保证较大数放在除数的位置上,需要对两个数进行调换。

当两个数的最大公约数为1时,这两个数被称为互质。

实际上,该算法也可以进行扩展,用于计算多个数的最大公约数。具体方法为:计算出前两个数的最大公约数,再将该最大公约数和第三个数计算其最大公约数,重复这个过程,直到计算完所有的数。

代码实现

下面是 C++ 中实现数组中给定索引范围的 GCD 的代码:

#include<iostream>
using namespace std;
int gcd(int x,int y){//欧几里得算法求最大公约数
    if(x<y) swap(x,y);
    return y==0?x:gcd(y,x%y);
}
int main(){
    int a[10]={1,2,3,4,5,6,7,8,9,10},l=3,r=8;//假设数组a=[1,2,3,4,5,6,7,8,9,10],查询区间[l,r]=[3,8]
    int res=a[l];//用res存储当前的GCD
    for(int i=l+1;i<=r;i++){
        int temp=gcd(res,a[i]);//求当前位置与前一个位置的GCD
        res=temp;
        if(res==1) break;//如果当前位置与前一个位置的GCD为1,则当前区间的GCD一定为1,可以直接跳出循环了
    }
    cout<<res<<endl;//输出查询区间[l,r]的GCD
    return 0;
}

下面是对上述代码的解释:

  1. gcd() 函数给定两个正整数 x 和 y,返回这两个数的最大公约数。本函数使用了欧几里得算法,即:
  • 如果 x < y,则交换 x 和 y 的值。
  • 如果 y 等于 0,返回 x。
  • 否则,计算 x % y 的值,并将 y 的值赋给 x,将 x % y 的值赋给 y,继续执行步骤 2。
  1. 主函数中,定义了数组 a 以及查询区间的左右端点 lr。(本代码中定义的数组长度为10,并且查询的区间为 [3,8])

  2. res 存储当前区间的 GCD。在第一次循环中,我们将 res 设为 a[l] (也就是区间的左端点),并遍历查询区间中的所有元素。

  3. 对于数组中从 l+1r 的所有元素,我们使用 gcd() 函数计算这些元素与前一个元素之间的 GCD,并将结果保存到 temp 中。然后,我们将 temp 赋给 res,并判断 res 是否为 1。如果 res 等于 1,说明这个区间的 GCD 已经为 1 了,我们可以直接跳出循环并输出结果。

  4. 如果循环执行完毕,说明这个区间的 GCD 不为 1,我们将结果输出即可。

总结

本文介绍了如何在 C++ 中使用 Euclidean算法 查找数组中给定索引范围的 GCD。希望本文能对大家有所帮助。