【问题描述】
对于一块m×n 的地块,需要将其划分为若干个相同正方形的方块,且每个方块的边长尽量地长。
【输入形式】
输入 m 和 n ( 1 ≤ m、 n ≤0.5×109), 分别表示地块的长和宽。
【输出形式】
输出两个整数,表示划分以后的正方形的个数以及边长。
该题本质上是运用辗转相除法来求两个数的最大公约数。
求最大的边长相当于长和宽相等的最大值,即为最大公约数。
在此仅介绍最大公约数的算法,原理可以参考百度。
假设存在a,b两数,求a,b的最大公约数:
1.保证a>b 若不成立,用条件语句调换顺序
2.若a%b==0,则b即为a,b两数的最大公约数
若a%b!=0,且a%b=c,则对b,c进行上述操作(b>c恒成立),即若b%c==0,则c为b,c的最大公约数,同时为a,b的最大公约数。若b%c!=0,继续上述操作。
在设计求最大公约数的过程中使用了递归算法。
#include<iostream>
using namespace std;
long lcm(long a,long b ) { //设计求最大公约数的函数
if(a<b) {
long temp=a;//若a<b,则调换两数的顺序
a=b;
b=temp;
}
if(a%b==0) {
return b;//边界条件,当a%b==0时 ,得到最大公约数
} else {
return lcm(b,a%b);//当不满足a%b==0时,继续取余,求最大公约数
}
}
int main() {
long m,n;
cin>>m>>n;
cout<<(m/lcm(m,n))*(n/lcm(m,n))<< " "<<lcm(m,n);//与之对应的土地数为m/lcm*n/lcm
}
新人小白,有其他方法,欢迎指出