问题描述
小明是城市规划局的一名实习生,最近他接到了一个有趣的任务:将一个长方形园区划分成若干个小正方形区域,每个区域用于不同的功能(如花园、游乐场、停车场等)。园区的长和宽都是整数,小明发现,每次划分时,他需要从园区中切出一个尽可能大的正方形,然后对剩余部分重复此过程,直到整个园区都被划分为正方形。
现在,给定园区的长度 L 和宽度 W(均为正整数),请你帮助小明计算,按照上述贪心策略(每次切出最大可能的正方形),最终会得到多少个正方形区域?
要求:
- 模拟贪心策略的过程:每次从当前矩形中切出最大的可能正方形(边长为当前矩形的最小边长),然后对剩余部分递归处理,直到所有部分都变成正方形。
- 算法应高效处理较大的输入范围。
测试样例
样例1:
输入:
L = 5, W = 3输出:4解释:第一步:切出 3x3 的正方形(1个),剩余 2x3 的矩形;第二步:切出 2x2 的正方形(1个),剩余 2x1 的矩形;第三步:切出 1x1 的正方形(1个),剩余 1x1 的矩形;第四步:切出 1x1 的正方形(1个)。总共 4 个正方形。
样例2:
输入:
L = 4, W = 6输出:3解释:第一步:切出 4x4 的正方形(1个),剩余 4x2 的矩形;第二步:切出 2x2 的正方形(1个),剩余 2x2 的矩形;第三步:切出 2x2 的正方形(1个)。总共 3 个正方形。
样例3:
输入:
L = 1, W = 1输出:1解释:本身就是一个正方形,不需要划分。
约束条件
- 1 ≤ L, W ≤ 1000
- 输入保证 L 和 W 都是正整数
- 贪心策略:每次从当前矩形中切出最大的可能正方形(边长为当前矩形的最小边长),然后对剩余部分递归处理
程序代码
#include <stdio.h>
int countSquares(int L, int W) {
int count = 0;
while (L > 0 && W > 0) {
if (L == W) {
count += 1;
break;
}
if (L < W) {
// 交换,保证 L >= W
int temp = L;
L = W;
W = temp;
}
// L >= W,切出 W x W 的正方形
count += L / W;
L = L % W;
}
return count;
}
int main() {
printf("%d\n", countSquares(5, 3)); // 4
printf("%d\n", countSquares(4, 6)); // 3
printf("%d\n", countSquares(1, 1)); // 1
return 0;
}
cpp
#include <stdio.h>
int countSquares(int L, int W) {
int count = 0;
while (L > 0 && W > 0) {
if (L == W) {
count += 1;
break;
}
if (L < W) {
// 交换,保证 L >= W
int temp = L;
L = W;
W = temp;
}
// L >= W,切出 W x W 的正方形
count += L / W;
L = L % W;
}
return count;
}
int main() {
printf("%d\n", countSquares(5, 3)); // 4
printf("%d\n", countSquares(4, 6)); // 3
printf("%d\n", countSquares(1, 1)); // 1
return 0;
}
运行结果
