求最大公约数与最小公倍数

来源:互联网 发布:江苏省人口普查数据 编辑:程序博客网 时间:2024/05/18 23:15

1.最大公约数:

1.1辗转相除法(推荐)

用两个数中的大数除以小数,若整除则小数即为俩数最大公约数,否则需要将大数除以小数的余数作为除数,两个数中较小数作为新的除数,进行新一轮的除法判断,直到除数整除被除数,此时的除数即为俩初始数值的最大公约数。

例:求78与60的最大公约数:

78 / 60=1余18;

60 / 18=3余6;

18 / 6=3余0。

则78与60的最大公约数为6;


#include <iostream>//辗转相除法 using namespace std;int main(){int a,b;while(cin>>a>>b){int max=a>=b?a:b;int min=a<b?a:b; while(max%min!=0)//循环,可用递归函数代替{int temp=min;min=max%min;max=temp;}cout<<min<<endl;}return 0;} 
 辗转递归调用:
#include <iostream>using namespace std;int MaxY(int a,int b) {   int min, max;  max=a>b?a:b;min=a<b?a:b;  if(max%min==0)     return min;   else   return MaxY(min,max%min); }  int main() {   int a,b;   cout<<"输入两个整数,用空格分隔,按回车键(Enter):";  cin>>a>>b;   cout<<"这两个整数的最大公约数为:"<<MaxY(a,b)<<endl;  return 0; }

2.最小公倍数

2.1运用最大公约数求:

俩数之积除以俩数最大公约数即为其最小公倍数

如:12与8最大公约数为4

则其最小公倍数为12*8/4=24

#include <iostream>//辗转相除法 using namespace std;int main(){int a,b;while(cin>>a>>b){int max=a>=b?a:b;int min=a<b?a:b; while(max%min!=0)//循环 {int temp=min;min=max%min;max=temp;}cout<<min<<endl;cout<<a*b/min<<endl;}return 0;} 
应用举例:杭电1019
http://acm.split.hdu.edu.cn/showproblem.php?pid=1019
//Least Common Multiple#include <iostream>using namespace std;int LCM(int nu,int res)//辗转相除法{int max = nu>=res ? nu:res;int min = nu<res ? nu:res;while(max%min!=0){int temp=min;min=max%min;max=temp;}return nu/min*res;//此处千万注意不可写成:nu*res/min否则会溢出,题目要求在32位范围内}int main(){int n;cin>>n;while(n--){int result=1;int count;cin>>count;for(int i=0;i<count;i++){int num;cin>>num;result=LCM(num,result);//result从1开始,然后和输入的数两个两个求最小公倍数}cout<<result<<endl;}return 0;}
 递归法:
#include <iostream>using namespace std; int MaxY(int a,int b) {   int min, max;  max=a>b?a:b;min=a<b?a:b;  if(max%min==0)     return min;   else   return MaxY(min,max%min); }  int main() {   int a,b;   cout<<"输入两个整数,用空格分隔,按回车键(Enter):";  cin>>a>>b;   cout<<"这两个整数的最大公约数为:"<<MaxY(a,b)<<endl;  cout<<"折两个整数的最小公倍数为:"<<a*b/MaxY(a,b)<<endl;return 0; }

2.2用++求

用大数除以小数,若能除尽,则大数即为俩数的最小公倍数,否则将数值++,同时检验能否整除俩数,直至找到,即为俩数的最小公倍数。

该方法思路简单,但数大的话,运行慢
#include <iostream>using namespace std;int main(){int a,b;while(cin>>a>>b){int num=a>b?a:b;while(num%b!=0||num%a!=0){num++;}cout<<num<<endl;}return 0;} 
 

0 0
原创粉丝点击