【C++入门题】土地分割(递归实现)

一、【问题描述】

【问题描述】

      对于一块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即可,对于初学者(本人)理解递归有一定的帮助。笔者小白,欢迎提出新的见解或问题!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值