如何摆脱2个数字的公约数
How to get rid of 2 numbers' common divisors
所以我有一个函数,可以对一对数字进行除法,直到它们不再有公约数:
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:
- 设a是两个给定正整数中较大的一个,b较小
- 设r是a除以b的余数
- 如果r为零,我们就完成了,b是最大公约数
- 否则,让a取b的值,让b取r值,然后转到步骤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;
}
编译器资源管理器
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 检查输入是否不是整数或数字
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 如何用数字处理log(0)
- 最高有效数字侧的第N位
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 如何获取一个数字的前3位
- 查找最接近的大于当前数字的数字的索引
- 找到两对数字,使它们的乘积的绝对差最小化
- 我想做一个彼此不同但重复出现的数字
- 将数字转换为字母(例如:123 转换为一二三)
- C++如何计算用户输入的数字中的偶数位数
- 如何在C++中确定文本文件中的元素是字符还是数字
- Python中的for循环与C++有何不同
- 打印数字图案
- C++ 比较 2 个不同列表中的值以使用 2 for 循环摆脱重复的数字。无法正确检测重复项
- 如何摆脱2个数字的公约数
- 可怕的数字不知从何而来
- 我的程序应该摆脱不是数字的字符,但不能完全工作,关于我做错了什么有什么想法吗?