📅  最后修改于: 2023-12-03 14:59:49.437000             🧑  作者: Mango
本文介绍如何在 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;
}
下面是对上述代码的解释:
gcd()
函数给定两个正整数 x 和 y,返回这两个数的最大公约数。本函数使用了欧几里得算法,即:主函数中,定义了数组 a
以及查询区间的左右端点 l
和 r
。(本代码中定义的数组长度为10,并且查询的区间为 [3,8])
res
存储当前区间的 GCD。在第一次循环中,我们将 res
设为 a[l]
(也就是区间的左端点),并遍历查询区间中的所有元素。
对于数组中从 l+1
到 r
的所有元素,我们使用 gcd()
函数计算这些元素与前一个元素之间的 GCD,并将结果保存到 temp
中。然后,我们将 temp
赋给 res
,并判断 res
是否为 1。如果 res
等于 1,说明这个区间的 GCD 已经为 1 了,我们可以直接跳出循环并输出结果。
如果循环执行完毕,说明这个区间的 GCD 不为 1,我们将结果输出即可。
本文介绍了如何在 C++ 中使用 Euclidean算法 查找数组中给定索引范围的 GCD。希望本文能对大家有所帮助。