C语言/数据结构欧几里得算法题解:长方形切割最大正方形——贪心划分计数

问题描述

小明是城市规划局的一名实习生,最近他接到了一个有趣的任务:将一个长方形园区划分成若干个小正方形区域,每个区域用于不同的功能(如花园、游乐场、停车场等)。园区的长和宽都是整数,小明发现,每次划分时,他需要从园区中切出一个尽可能大的正方形,然后对剩余部分重复此过程,直到整个园区都被划分为正方形。

现在,给定园区的长度 L 和宽度 W(均为正整数),请你帮助小明计算,按照上述贪心策略(每次切出最大可能的正方形),最终会得到多少个正方形区域?

要求:

  1. 模拟贪心策略的过程:每次从当前矩形中切出最大的可能正方形(边长为当前矩形的最小边长),然后对剩余部分递归处理,直到所有部分都变成正方形。
  2. 算法应高效处理较大的输入范围。

测试样例

样例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;
}

运行结果

相关推荐
2601_970703836 小时前
工业除湿机租赁:把一份租金合同拆开看
大数据·数据结构·算法·数据库架构·推荐算法
心中有你02146 小时前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法
ZhengEnCi7 小时前
同样的模型,为什么本地和云 API 差别那么大:量化精度、聊天模板与采样参数的三大元凶
人工智能·算法·llm
Zwawa7 小时前
串口为什么会丢字节:从轮询到中断和环形缓冲区
c语言·单片机·嵌入式
Flynn Liang7 小时前
RAG 答非所问/幻觉怎么破?Spring AI QuestionAnswerAdvisor 召回优化实战(TopK/重排/混合检索)
人工智能·算法·spring·rag·幻觉·springai
liminla!7 小时前
SQL 从入门到进阶:语法速查与实战练习(完整优化版)
数据库·sql·算法
维克兜率天9 小时前
【维克】指数调整:哪些股票会被“强制买入“?
人工智能·python·算法
罗西的思考9 小时前
【轻量化复刻大模型】线性注意力交互式演示
人工智能·算法·机器学习
神也畏惧菠萝9 小时前
Day08 Python流程控制从入门到上瘾:if/match/while/for四件套,从B站登录一路打到猜数字游戏
python·算法·数据存储·for·while·if·ifelse