首先对题目进行分析,可以选择利用递归来进行解题, 有两种写法,一种程序运行时间较长一点的,另一种是运行时间较少的一种 两种写法的大致过程相同 只是一些小的地方有所改进,接下来对问题进行分析
可以了解到以下的情况,当n=m时,其本身就是一个正方形所以可以分1个,当n%m==0时,说明可以被整除 所以可以分为n/m个 比如长12,宽2 最少可以分12/2=6个,下面的情况就是最后一种了 n>m || n<m 此时可以先排一下序,让大的数为n,小的数为m 有利于下面的编程 此时长n,宽m的长方形可以分成几部分之和 第一部分也就是 m*m的一个正方形 加上 一个长为n-m,宽为m的长方形继续进行划分正方形 看是否满足上述几个情况,不满足继续进行最后一种情况的分法 如此往复直到结束
具体代码如下
#include <iostream>
using namespace std;
int fun(int n, int m)
{
if (n == m)
return 1;
if (max(n, m) % min(n, m)==0)
return max(n, m) / min(n, m);
else
return 1 + fun(max(n, m) - min(n, m), min(n, m));
}
int main()
{
int n, m;
cin >> n >> m;
cout << fun(n, m) << endl;
}
但是这种写法程序的运行时间稍长一点,如果题目对时间有要求可能就会出现时间超限这种情况,接下来还有改进了一下的写法,可以减少些程序运行的时间
接着上面最后一种情况的分析,还有一个比较简便的写法,如果我们在本子上面多画几张图仔细观察一下可能就会发现 比如一个长7宽2的矩形
画的不行凑合看,可以发现一个7 2的矩形最少可以分成如图几个正方形按照上面的最后一种情况我们应该返回 1+fun(7-2,2) 进行递归 直到递归到fun(2,1)的情况满足上面所说的第二种情况,退出递归得出答案,但是这样每次都需要递归很多次才能得到答案,有没有一种递归的数量少的情况呢? 仔细观察可以我们可以发现其实可以返回这样的值 n/m+fun(m,n%m) 也就是7/2=3 fun(2,1) 这种情况 直接一步到位,fun(m,n%m)刚好满足上面所说的第二种情况可以减少递归的次数,减少一些程序运行时间 代码如下
#include <iostream>
#include <algorithm> //调用swap函数
using namespace std;
int fun(int a, int b)
{
if (a == b)
return 1;
else if (a < b)
swap(a, b); //swap的作用是交换a,b的值
if (a % b == 0)
return a / b;
else
{
return a/b + fun(b, a%b);
}
}
int main()
{
int a, b;
while (cin >> a >> b)
{
cout << fun(a,b) << endl;
}
}
这样运用递归就解决了