求最大公约数与最小公倍数
来源:互联网 发布:江苏省人口普查数据 编辑:程序博客网 时间: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;}应用举例:杭电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;}
0 0
- 求最大公约数与最小公倍数
- 求最大公约数与最小公倍数
- 求最大公约数与最小公倍数
- 求最大公约数与最小公倍数
- 求最大公约数与最小公倍数
- 求最小公倍数与最大公约数
- 求 最小公倍数 与 最大公约数
- 求最大公约数与最小公倍数
- 求最大公约数与最小公倍数
- 求最大公约数与最小公倍数
- 求最大公约数与最小公倍数
- PHP 求最大公约数与最小公倍数
- Java求最大公约数与最小公倍数
- C++求最大公约数与最小公倍数
- Java求最大公约数与最小公倍数
- 5 求最大公约数与最小公倍数
- 01-求最大公约数与最小公倍数
- c++: 求最大公约数 与 最小公倍数
- spring事务管理(一)
- 常用日期函数
- 《C++实现数据结构》:二叉树
- 为什么以太网无法接收大于1500字节的数据包
- javascript 实现快排的两种方法 和sort()的比较,以及效率
- 求最大公约数与最小公倍数
- 步进电机原理
- AES,MD5,RSA,SHA系列等各类加密解读
- Git个别理解
- Q94:怎么用ray tracing画部分圆环(Part Tori)
- [Bootkit]开源Bootkit技术(三)vBootkit
- 一个小巧好用的个人知识管理系统-TiddlyWiki.
- Python-内置数据类型
- div和section有什么区别?在加一个article标签