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; }应用举例:杭电1019http://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; }