题目描述
题解
思路:
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;
}
过于复杂写了很多没必要的语句:
-
**长短边的逻辑混乱:**在代码中,尝试通过判断长边是否等于短边并交换它们的值来处理,但这一步骤实际上是不需要的。因为长边和短边的概念是相对的,它们的值在每次循环迭代时可能会变化,但不需要显式地交换它们。只需在每次循环中基于当前的长和宽判断哪一边是长边,哪一边是短边,并相应地从长边切下正方形。
-
**更新剩余矩形长宽的逻辑有误:**代码中尝试在切割正方形后更新长宽,但处理方式复杂且可能引入错误。实际上,每次切割后,只需简单地更新长边(长边减去短边的长度),而不需要进行额外的交换和赋值操作。
-
**长短边重新赋值的冗余:**在每次循环的末尾,尝试根据长短边的长度重新赋值
length
和width
,但这一步骤是多余的,因为在循环的开始,我们应当直接使用length
和width
来决定如何切割正方形,并更新这两个变量。
修正这些问题后,代码应更简洁,且逻辑更为清晰。每次循环仅需判断当前的长宽哪个更大,并从较长的边切下与较短边长度相等的正方形,然后更新较长边的长度。这样直到其中一边的长度变为0,循环结束。