c++ - 使用除法技术求数组的最大公约数

标签 c++ arrays function recursion divide-and-conquer

我正在尝试查找数组的 GCD/HCF,我知道编写使用欧几里得算法查找两个数字的 GCD 的函数。因此,为了找到数组的 GCD,我想使用欧几里得算法作为 GCD 数组的分而治之技术。我成功地能够划分它,但坚持使用合并函数再次执行 GCD 操作,我正在为这种情况下的合并函数(即征服部分)寻求帮助。

我的代码是这样的;

#include <iostream>
using namespace std;
long long GCD(long long  m,long long n)
{
    while(m%n!=0)
    {
        long long next_m=n;
        long long next_n=m%n;
        m=next_m;
        n=next_n;
    }
    return n;
}
//define merge function.
long long hcf_arr(long long *arr,long long start,long long end){
    if(end-start+1==2){
        return GCD(arr[start],arr[end]);
    }
    else{
        long long *u;
        u=new long long[(end-start+1)/2];
        long long *v;
        v=new long long[(end-start+1)-(end-start+1)/2];
        for(long long i=start;i<=(end-start+1)/2;i++){
            u[i]=arr[i];
        }
        for(long long i=(end-start+1)/2+1;i<=(end-start+1);i++){
            v[i]=arr[i];
        }
        hcf_arr(u,start,(end-start+1)/2);
        hcf_arr(v,(end-start+1)/2+1,end-start+1);
        //Merge function

    }

}

int main() {
    
}

最佳答案

您可以找到左右子数组的 GCD,并计算这两个子数组的 GCD。这是可行的,因为如果将任何数字替换为包含该数字的任何子数组的 GCD,则数字列表的 GCD 保持不变。

仅供引用,这个std::reduce(arr.begin(),arr.end(),arr[0],GCD);有一个很好的单行代码。

几点:

  1. 我看到 newdelete 语句的数量不等,这不好。使用std::vector
  2. 那些 for 循环可以替换为 std::copy
  3. 前两个步骤可以与 std::vector 的基于范围的构造函数结合使用。
  4. 由于您不修改数组,因此将它们标记为 const。

关于c++ - 使用除法技术求数组的最大公约数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68313138/

相关文章:

c - 在 C 语言中使用 struct Aliasname* 作为函数返回类型

java - 在单个类中实现 Function 和 Buffer 是个好主意吗?

python - python 中的数组/图像插值

c++ - 如何通过某个元素可以在特定专业范围内进行评估?

c++ - 通过 "Value Template Argument"与常规数组在堆栈中分配内存

c++ - 对象的内部结构是什么(EDIT : MFC) CString class?

c - 迭代复制多个字符

c++ - 从输入文件读取数据到数组时出错

c++ - 错误 : expected primary-expression before ')' token (C)

c++ - 我应该如何将 getDC 用作具有自动清理功能的本地对象? C++