求最大公约数和最小公倍数的算法实现

最近开始刷一些简单的C语言题目。做到一道求最大公约数和最小公倍数的题目,有印象自己做过,但发现还是不熟练,所有我决定将心得写下来,供以后复习用。

首先我想到的一种方法就是直接暴力解决,一个一个试,因为求最大的,所有从大往小试,第一个满足条件的就是最大公约数,代码如下

 1 #include<iostream>
 2 #include<stdio.h>
 3 using namespace std;
 4 int main()
 5 {
 6     int m,n;
 7     int common=1000;
 8     cin>>m;
 9     cin>>n;
10     while(1)
11 {
12     
13     if(m%common==0&&n%common==0)
14     {
15         cout<<common;
16         break;
17     }
18     
19     else{
20         common--;
21     }
22     
23 }    return 0;
24 }

当然,这其实是一个最直接最好理解的方法,但当数字越来越大时,它的效率明显是不高的。

这里就有了第二种方法“辗转相除法”:

  这种方法也很好理解,首先我们取两个数,一个max一个min,分别代表两个数中较大的和较小的哪一个。

  第一步:用max%min得到一个结果,我们取一个变量temp来存储它。于是temp=max%min;

  第二步:将min的值赋给max,将temp的值赋给min,继续以上步骤知道temp=0;那么上一轮的temp即为最大公约数(即本轮的max)

 1 #include <iostream> 
 2 using namespace std;
 3 int main()
 4 {
 5     int temp=1,max,min;
 6     cin>>max;
 7     cin>>min;
 8     while(temp)
 9     {
10         temp=max%min;
11         max=min;
12         min=temp;
13     }
14     cout<<max;
15     return 0;
16 }

在得到最大公约数后最小公倍数就显得很简答了,它等于(max*min)/temp;至此求得最小公倍数和最大公约数。

猜你喜欢

转载自www.cnblogs.com/Truedragon/p/12213634.html