如何摆脱2个数字的公约数

How to get rid of 2 numbers' common divisors

本文关键字:数字 何摆脱 2个      更新时间:2023-10-16

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

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;
}
}
}
}

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

使用欧几里得算法1:

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

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

引文

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

备注

欧几里得使用了减法,这里已将减法改为余数。

一旦这个算法开始工作,你可能会考虑稍微复杂一点的二进制GCD,它用减法和位运算取代除法(在一些处理器上很慢)。

听起来像是C++17库功能gcd的一项工作。

#include <numeric>
void simplify(int &x, int &y)
{
const auto d = std::gcd(x, y);
x /= d;
y /= d;
}

编译器资源管理器