c++ - 如何去掉两个数的公约数

标签 c++

所以我有一个函数可以除以一对数字,直到它们不再有公约数:

void simplify(int &x, int &y){
    for (int i = 2;;++i){
        if (x < i && y < i){
            return;
        }
        while (1){
            if (!(x % i) && !(y % i)){
                x /= i;
                y /= i;
            } else {
                break;
            }
        }
    }
}

如何提高效率?我知道这个解决方案中的一个问题是它测试复合数的可除性,当它到达它们时它不会有任何它的因素,所以它只是浪费了计算。如果程序事先不知道一组素数/在函数运行时计算它们,我可以这样做吗?

最佳答案

使用the Euclidean algorithm 1:

  1. a 为两个给定正整数中较大的一个,b 为较小的一个。
  2. ra 除以 b 的余数。
  3. 如果 r 为零,我们就完成了,b 是最大公约数。
  4. 否则,让ab的值,让br的值,并且转到第 2 步。

一旦你有了最大公约数,你就可以将原来的两个数除以它,这将产生两个比率相同但没有大于一的公因数的数。

引用

1 欧几里得,元素,第七册,命题 1 和命题 2,大约公元前 300 年。

注意事项

欧几里得用的是减法,这里改成了余数。

一旦该算法起作用,您可能会考虑稍微复杂一点的 Binary GCD ,用减法和位运算代替除法(在某些处理器上速度很慢)。

关于c++ - 如何去掉两个数的公约数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54254558/

相关文章:

c++ - Qt静态库构建后不输出任何文件

c++ - 基于 Qt 的 CD 开膛手的线程构建 block (TBB)?

c++ - 读取文件并将其存储在 unordered_map 中时出现问题

c++ - 为连接的 OMNeT++ 门分配随机选择但匹配的参数?

c++ - g++ 编译器 : error invalid conversion from 'pthread_t {aka long unsigned int}' to 'void* (*)(void*)' [-fpermissive]

c++ - `boost::local_time::date_time` 来自 `std::string`

c++ - 为什么我们使用 char* 作为缓冲区,为什么不使用 boost::asio 中的字符串?

C++内存故障排除

c++ - Lambda 到 std::function 的转换性能

C++ make_pair没有找到匹配的函数