#6097. gesp五级真题分类八:欧几里得算法
gesp五级真题分类八:欧几里得算法
欧几里得算法(共 10 题)
单选题
- 对如下代码实现的欧几里得算法(辗转相除法),执行 gcd(48,18) 得到的调用序列为( )。
{{ select(1) }}int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); }
- gcd(48,18) → gcd(18,12) → gcd(12,6) → gcd(6,0)
- gcd(48,18) → gcd(30,18) → gcd(12,18)
- gcd(48,18) → gcd(18,30) → gcd(30,6)
- gcd(48,18) → gcd(12,18) → gcd(6,12)
- 下面是根据欧几里得算法编写的函数,它计算的是 a 与 b 的( )。
{{ select(2) }}int gcd(int a, int b) { while (b != 0) { int temp = b; b = a % b; a = temp; } return a; }
- 最小公倍数
- 最大公共质因子
- 最大公约数
- 最小公共质因子
- 欧几里得算法还可以写成如下形式:
下面有关说法,错误的是( )。int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); }
{{ select(3) }}
- 本题的 gcd() 实现为递归方式。
- 本题的 gcd() 代码量少,更容易理解其辗转相除的思想。
- 当 a 较大时,本题的 gcd() 实现会多次调用自身,需要较多额外的辅助空间。
- 当 a 较大时,相比上题中的 gcd() 的实现,本题的 gcd() 执行效率更高。
- 两块长方形土地的长宽分别为 24 和 36 米,要将它们分成正方形的小块,使得正方形的尺寸尽可能大。小杨采用如下的辗转相除函数 gcd(24,36) 来求正方形分块的边长,则函数 gcd 调用顺序为( )。
{{ select(4) }}int gcd(int a, int b) { int big = a > b ? a : b; int small = a < b ? a : b; if (big % small == 0) return small; return gcd(small, big % small); }
- gcd(24,36)、gcd(24,12)、gcd(12,0)
- gcd(24,36)、gcd(12,24)、gcd(0,12)
- gcd(24,36)、gcd(24,12)
- gcd(24,36)、gcd(12,24)
- 用以下辗转相除法(欧几里得算法)求 gcd(84,60) 的步骤中,第二步计算的数是( )。
{{ select(5) }}int gcd(int a, int b) { int big = a > b ? a : b; int small = a < b ? a : b; if (big % small == 0) return small; return gcd(small, big % small); }
- 84 和 60
- 60 和 24
- 24 和 12
- 12 和 0
- 下面代码实现了欧几里得算法。下面有关说法,错误的是( )。
{{ select(6) }}int gcd(int a, int b) { int big = a > b ? a : b; int small = a < b ? a : b; if (big % small == 0) return small; return gcd(small, big % small); }
- 该算法可以求出最大公约数
- 该算法的时间复杂度为 O(log min(a,b))
- 如果 a 和 b 都是质数,该算法会递归一次
- 该算法在 a 和 b 相差很大时效率较低
- 辗转相除法也被称为( )。
{{ select(7) }}
- 高斯消元法
- 费马定理
- 欧几里德算法
- 牛顿迭代法
- 下面代码实现两个整数除法,其中被除数为一个“大整数”,用字符串表示,除数是一个小整数,用 int 表示,则横线处应该填写( )。该代码也用到了欧几里得算法的思想吗?不,这里是高精度除法,但本题作为欧几里得算法部分的最后一题,实为高精度除法。不过为了保持分类,这里还是放一个与欧几里得相关的题目。实际上真题中有一道直接问欧几里得算法别名的题目(第7题)。第8题我改为:下面代码实现的是( )。
该算法的时间复杂度是( )。int gcd(int a, int b) { if (b == 0) return a; return gcd(b, a % b); }
{{ select(8) }}
- O(a)
- O(b)
- O(log min(a,b))
- O(ab)
判断题
- 下面 C++ 代码是用欧几里得算法(辗转相除法)求两个正整数的最大公约数,a 大于 b 还是小于 b 都适用。
{{ select(9) }}int gcd(int a, int b) { if (a % b == 0) return b; return gcd(b, a % b); }
- 正确
- 错误
- 假设函数 gcd() 能正确求两个正整数的最大公约数,则下面的 lcm() 函数能求相应两数的最小公倍数。
{{ select(10) }}int lcm(int a, int b) { return a * b / gcd(a, b); }
- 正确
- 错误