蓝桥杯习题一:切割正方形

本文讨论了如何在C++中实现一个简单的算法,用于在一个给定的矩形中找到并计算可以切割的最大正方形数量。原始代码存在冗余逻辑和不必要的步骤,经过优化后,代码变得更清晰,仅通过一次循环判断并更新长边和宽边来实现切割。
摘要由CSDN通过智能技术生成

题目描述

在这里插入图片描述

题解

思路:
1、数学思想:
矩形中切出最大的一块正方形 == 每次以短边(宽)为边长切割;
长边够长时可以切出多个正方形;
每次切割后较长的边会做减法;
2、循环逻辑:
当长切割多次小于宽时,宽做长边开始切割;
这里可以使用一个if else 语句进行选择;
3、结束条件处理:
任意一边为0时,跳出执行;
代码

#include <stdio.h>

int main() {
    int length = 2019, width = 324;
    int count = 0;  // 切割出的正方形数量

    while (length > 0 && width > 0) {
        if (length > width) {
            length -= width;  // 从长度较长的边切下一个与较短边等长的正方形
        } else {
            width -= length;  // 同上,操作反之
        }
        count++;  // 每次切割都增加正方形的数量
    }

    printf(" %d \n", count);  // 输出切割出的正方形数量
    return 0;
}

这段代码是最终调整后的代码:
以下是我的错误思路:

#include <stdio.h>

int cutSquares(int length, int width) {
    int count = 0;  // 切割出的正方形数量

    while (length > 0 && width > 0) {
        // 确定当前矩形的长边和短边
        int longSide = length, shortSide = width;

        // 如果长边等于短边,将它们交换
        if (longSide == shortSide) {
            int temp = longSide;
            longSide = shortSide;
            shortSide = temp;
            int tempLen = length;
            length = width;
            width = tempLen;
        }

        // 从长边切割出最大正方形
        int side = shortSide;
        count++;
        // 如果剩余长边短于当前短边,则交换长宽
        if (longSide < shortSide) {
            int temp = longSide;
            longSide = shortSide;
            shortSide = temp;
            int tempLen = length;
            length = width;
            width = tempLen;
        }
    }

    return count;
}

int main() {
    int length = 2019, width = 324;
    int totalSquares = cutSquares(length, width);
    printf("出 %d\n", totalSquares);
    return 0;
}

过于复杂写了很多没必要的语句:

  1. **长短边的逻辑混乱:**在代码中,尝试通过判断长边是否等于短边并交换它们的值来处理,但这一步骤实际上是不需要的。因为长边和短边的概念是相对的,它们的值在每次循环迭代时可能会变化,但不需要显式地交换它们。只需在每次循环中基于当前的长和宽判断哪一边是长边,哪一边是短边,并相应地从长边切下正方形。

  2. **更新剩余矩形长宽的逻辑有误:**代码中尝试在切割正方形后更新长宽,但处理方式复杂且可能引入错误。实际上,每次切割后,只需简单地更新长边(长边减去短边的长度),而不需要进行额外的交换和赋值操作。

  3. **长短边重新赋值的冗余:**在每次循环的末尾,尝试根据长短边的长度重新赋值lengthwidth,但这一步骤是多余的,因为在循环的开始,我们应当直接使用lengthwidth来决定如何切割正方形,并更新这两个变量。

修正这些问题后,代码应更简洁,且逻辑更为清晰。每次循环仅需判断当前的长宽哪个更大,并从较长的边切下与较短边长度相等的正方形,然后更新较长边的长度。这样直到其中一边的长度变为0,循环结束。

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

琪琪的小白先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值