东方博宜OJ ——1335 - 土地分割
递归 入门 ————1335 - 土地分割
- 1335 - 土地分割
- 题目描述
- 输入
- 输出
- 样例
- 问题分析
- 递归解法(欧几里得算法)
- 代码实现
- 总结
1335 - 土地分割
题目描述
把一块m * n米的土地分割成同样大的正方形,如果要求没有土地剩余,分割出的正方形土地最大边长是多少米?(最少不能少于1米*1米)如:一块6米 * 4米的土地,能够分割的最大的正方形的边长为2米。(5.2.45)
输入
两个整数m和n(m,n <= 10^ 18)
输出
能够分割的最大正方形的边长
样例
- 输出:
6 4
- 输出:
2
问题分析
这道题实际上是在求 m 和 n 的最大公约数(GCD),因为:
- 正方形的边长 k 必须能整除 m 和 n(即 m % k == 0 且 n % k == 0)。
- 最大的 k 就是 GCD(m, n)。
递归解法(欧几里得算法)
我们可以用 欧几里得算法(辗转相除法) 递归求解 GCD(m, n):
-
基本情况:如果 n == 0,则 GCD(m, 0) = m。
-
递归情况:GCD(m, n) = GCD(n, m % n)。
代码实现
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
// 1335 - 土地分割
long long gcd(long long m, long long n){
// 欧几里得算法
// 递归出口 被除数 == 0 说明除数已经是最小公倍数了
if ( n == 0) return m;
// 辗转连除 求最小公倍数
return gcd(n, m % n);
}
int main() {
long long m, n;
cin >> m >> n;
cout << gcd(m, n) << endl;
return 0;
}
总结
- 递归解法:直接套用欧几里得算法求 GCD(m, n)。
- 时间复杂度:O(log(min(m, n))),非常高效。
- 适用场景:适用于任意 m 和 n,只要它们是非负整数。