#ySybttg060303. 1627:【例 3】最大公约数
1627:【例 3】最大公约数
1627:【例 3】最大公约数
题目描述
给出两个正整数 ,求它们的最大公约数。
输入格式
输入共两行,第一行一个正整数 ,第二行一个正整数 。
输出格式
在第一行输出一个整数,表示 的最大公约数。
样例
样例输入 #1
18
24
样例输出 #1
6
样例解释 #1
。
数据范围
- 对于 的数据,;
- 对于 的数据,。
时空限制
- 时间限制:1000 ms
- 内存限制:524288 KB
注意:本题中 可能非常大(长达 位十进制数),因此不能直接用 long long 存储,也不能直接用欧几里得算法(因为取模运算涉及大数除法,较慢)。需要使用高精度计算最大公约数。
更相减损术(Stein算法)适用于高精度,因为它只涉及减法和位移,避免了取模运算。但单纯使用更相减损术可能较慢(例如 需要减很多次)。结合以下性质可以加速:
- 如果 都是偶数,则 。
- 如果 是偶数, 是奇数,则 。
- 如果 都是奇数,则 。
- 如果 ,则 。
这样,我们可以将高精度数表示为字符串或数组,实现高精度的除以 (右移)、判断奇偶性、减法、比较等操作。由于 可达 位,操作次数不会太多(因为每次操作都会减少数值的规模)。具体步骤:
- 如果 ,返回 。
- 如果 和 都是偶数,计数器 加 , 和 都除以 。
- 否则如果 是偶数, 除以 。
- 否则如果 是偶数, 除以 。
- 否则( 都是奇数),如果 ,则 ,否则 。
- 重复直到 。
最后返回 。
注意:高精度除以 可以通过逐位计算实现。高精度减法需要处理借位。由于 可能很大,但操作次数有限,可以通过递归或循环实现。
另外,也可以使用高精度取模的欧几里得算法,但实现较复杂。更相减损术结合移位(二进制算法)更易于实现高精度。
最后输出结果,注意结果可能很大,也要用高精度输出。