最近开始刷一些简单的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;至此求得最小公倍数和最大公约数。