0 前言
本题是蓝桥杯的一个选择题:矩形切割
1 题目
2 题目分析
从题目的情形中分离出问题的本质,实际上就是交替相除取余的问题。相除的本质是减法问题,比如题目中的例子:两边为5和3的材料,就是大边除以小边(即5里面有几个3),切完之后,长边的余数无非两种情况:
- 等于零(也就是剩余的长度刚好等于短边):此时就结束了,等于短边时剩下的材料自成为一个正方形
- 小于短边:此时之前的短边编程了长边。继续之前的操作就行了
于是根据这个思路,我们就可以写出代码。让计算机帮我们计算。
代码如下:
#include <iostream>
using namespace std;
int main(){
int c = 0, len = 2019, width = 324;
while(len != width){
int tmp = len % width;//长边对短边的余数
c += len / width; //长边有几个短边,也就是能切割几个正方形
if (tmp == 0){ //余数为零
break;
}else{ //余数不为零
len = width;
width = tmp;
}
}
cout<< c <<endl;
return 0;
}
其实呢除法本质上就是减法,那怎样用减法实现这个东西呢🤔
#include <iostream>
using namespace std;
int main(){
int c = 0, len = 2019, width = 324;
while(len != width){
if(len > width) {
len -= width;
}else{
width -= len;
}
c++;
}
c++;
cout<< c <<endl;
return 0;
}
while
循环的作用就是每次切割的时候判断剩下的材料是否是一个正方形,如果是的话就直接结束了。然后不能忘记把剩下的这个正方形算上,就是代码中的 while
结束后的 “c++”
(这个可以使用把 c
初始化为 1
来解决,但是这样个人认为可读性不高)。
while(len != width){
//do
}
其实这个想法很纯粹,就是按照题目中实际切割矩阵的步骤进行的。
if(len > width) {
len -= width;
}else{
width -= len;
}
切割前要判断,哪个边长,肯定是让短边当作正方形的边长,切割一下就把它减掉。
也可以把 while
循环换成 for
循环。代码如下:
#include <iostream>
using namespace std;
int main(){
int c = 0, len = 2019, width = 324;
for(int c = 0; len != width; c++){
if(len > width) {
len -= width;
}else{
width -= len;
}
}
c++;
cout<< c <<endl;
return 0;
3 总结
以上就是本文的左右内容了,感谢大家的观看,倘若大佬看到文中的错误之处,敬请批评指正,感谢感谢!