题目背景:假设你是一个农场主,有一块小土地,1680*640那么大,你要将这块土地均匀的分成方块,要使分出的方块足够大,应该怎么分?
样例输入:
1680 640
样例输出:
80
一个重要信息:将该土地以短边长划分土地,余下一块非方形土地,则适用于这小块土地的最大方块也是适用于整块地的最大方块(由欧几里德算法得出)。
思路:分而治之。递归条件为不断划分出这样的小块土地,并在这小块土地中再求原问题(降低了问题的规模);基线条件为这当小块土地是方形土地,即一边是另一边的整数倍时得到答案。
示例代码:
#include<iostream>
using namespace std;
int Farm(int a, int b)
{
if (a % b == 0 && a / b > 0) //基线条件
{
return b;
}
else if (b % a == 0 && b / a > 0) //基线条件
{
return a;
}
else //递归条件
{
if (a > b)
{
int x = a;
for (; x > b;)
{
x -= b;
}
return Farm(x, b);
}
if (b > a)
{
int y = b;
for (; y > a;)
{
y -= a;
}
return Farm(a, y);
}
}
}
int main()
{
int a, b;
cin >> a >> b;
cout << Farm(a, b);
return 0;
}
运行截图: