一、【问题描述】
【问题描述】
对于一块m×n 的地块,需要将其划分为若干个相同正方形的方块,且每个方块的边长尽量地长。
【输入形式】
输入 m 和 n ( 1 ≤ m、 n ≤0.5×10^9), 分别表示地块的长和宽。
【输出形式】
输出两个整数,表示划分以后的正方形的个数以及边长。
【样例输入】
1680 640
【样例输出】
168 80
二、正文
1.常规做法
若不使用递归,用循环从1开始遍历至min(m,n)是可行的,且代码也不复杂。
代码如下:
#include<iostream>
using namespace std;
int main(){
int a,n,m;
cin>>n>>m;
if(m>n) {
int temp=n;
n=m;
m=temp;//使得m值为较小值
}
for(int i=1;i<m;i++){
if(m%i==0&&n%i==0) a=i;
}
cout<<(m/a)*(n/a)<<" "<<a;//注意此处若写成m*n/(a*a),m*n会越界
}
2.递归解法
首先考虑递归函数的形参,m,n是必须的,然后笔者这这里引入参量a即正方形边长,初始值a=min(m,n)(a若大于m,n中任意值都会无法分割),并采用递减的方式找到a的最大值。
代码如下:
#include<iostream>
using namespace std;
int groundDivide(int m,int n,int a){
if(n%a==0&&m%a==0) //找到m与n都整除a的第一个值即为目标 !
return a;
else return groundDivide(m,n,a-1);
}
int main(){
int n,m,a;
cin>>m>>n;
a=n>=m?m:n;//将m,n中的较小者赋给a
int b=groundDivide(m,n,a);
cout<<(m/b)*(n/b)<<" "<<b;//同样注意越界问题!!
}
总结
这是到较为简单的递归题,思路主要在于分析出m与n都整除边长a即可,对于初学者(本人)理解递归有一定的帮助。笔者小白,欢迎提出新的见解或问题!