最大公约数、最小公倍数算法

#include <iostream>
using namespace std;

//举例:
// 2 |  8  6
//   ----------
//      4  3
// 所以:gcd=2,lcm=2*4*3=24

//求最大公约数:辗转相除法
// 1. a ÷ b,令r为所得余数(0≤r<b)
// 若 r = 0,算法结束;b 即为答案。
// 2. 互换:置 a←b,b←r,并返回第一步
int gcd1(int m, int n)
{
	int r;
	while(n)
	{
		r = m % n;
		m = n;
		n = r;
	};
	return m;
}

int gcd2(int m, int n)
{
	if(n)
		return gcd1(n, m%n);
	else
		return m;
}

//求最小公倍数:公式法
//由于两个数的乘积等于这两个数的最大公约数与最小公倍数的积。即(a,b)×[a,b]=a×b。所以,求两个数的最小公倍数,就可以先求出它们的最大公约数,然后用上述公式求出它们的最小公倍数。
int lcm(int m, int n)
{
	return (m*n)/gcd1(m, n);
}

int main()
{
	int m, n;
	cout<<"input two numbers:"<<endl;
	while(cin>>m)
	{
		cin>>n;
		if(m<=0 || n<=0)
		{
			cerr<<"error input!!!"<<endl;
			cout<<"input two numbers:"<<endl;
			continue;
		}
		cout<<"gcd("<<m<<", "<<n<<")="<<gcd1(m, n)<<endl;
		cout<<"lcm("<<m<<", "<<n<<")="<<lcm(m, n)<<endl;
		cout<<"input two numbers:"<<endl;
	}
	return 0;
}

时间: 2024-11-06 22:59:03

最大公约数、最小公倍数算法的相关文章

最大公约数和最小公倍数算法

// 最大公约数算法 // 1. a % b 进行取余运算 // 2. 将被取余数与余数进行再次取余运算 // 3. 直到a % b为0时停止取余运算 // 4. 将取余为0时的被取余数返回即是最大公约数 function gcd(a, b) { if (b === 0) { return a; } return gcd(b, a % b); } // 求多个数的最大公约数 const empsColumns = { Salary: [40000, 50000, 44000, 55000, 62

12--c完数/最大公约数/最小公倍数/素数/回文数

完数/最大公约数/最小公倍数/素数/回文数 2015-04-08 10:33 296人阅读 评论(0) 收藏 举报  分类: C/C++(60)  哈尔滨工业大学(8)  版权声明:本文为博主原创文章,未经博主允许不得转载. 1.一个正整数的因子是所有可以整除它的正整数.而一个数如果恰好等于除它本身外的因子之和,这个数就称为完数.例如6=1+2+3(6的因子是1,2,3). [cpp] view plain copy #include <stdio.h> #include <math.h

两种方法求最大公约数最小公倍数

<pre name="code" class="cpp">/* *coyright(c)2014 龙城无泪 *All rights reserved *文件名称 digui.c *作者:封尘之魂 *完成日期:20141108 *版本号V1.0 *问题描述:求两个整数的最大公约数最小公倍数 *输入描述:输入两个整数 *输出描述:成功输出最大公约数最小公倍数 */ #include<stdio.h> int main() {int m,n,q,t

最大公约数 最小公倍数--------专题

#include <stdio.h> int gcd(int m,int n){ if(n==0)  return m;else return gcd(n,m%n); } ************* 变形一 int gcd(int m,int n) { if(m%n==0)  return m; else return gcd(n,m%n); } 变形二 int gcd(int m,int n) { return  n==0?  m :  gcd(n,m%n); } 变形三 int gcd(i

最大公约数与最小公倍数算法整理

最大公约数:能够同时被两个数整除的那个最大的数. 最小公倍数:两个整数公有的倍数成为他们的公倍数,其中一个最小的公倍数是他们的最小公倍数. 最小公倍数=两整数的乘积÷最大公约数 反之同理. 最大公约数算法: 1.GCD算法(欧几里得算法): 定理:两个整数的最大公约数等于其中较小的那个数和两数的相除余数的最大公约数.最大公约数(greatest common divisor)缩写为gcd. gcd(a,b) = gcd(b,a mod b) (不妨设a>b 且r=a mod b ,r不为0) 1

求最大公约数的算法以及最小公倍数

短除法: #include<stdio.h> #include<stdlib.h> int max_approximate(int num1, int num2) { if (num1 > num2) { int tmp = 0; tmp = num1; num1 = num2; num2 = tmp; } int min = num1; while (min) { if ((num2%min == 0)&&(num1%min==0)) { return mi

最大公约数最小公倍数高效算法

一般来说求两个数最大公约数,我们最先想到的是先找到两个数中较小的数, 然后从较小的数开始递减暴力搜索,如果能同时被两个数整除,那么这个数就是最大公约数,不能则继续递减. 但是当两个数很大的时候,这个算法的效率就变得很差,这时我们就需要一个高效算法. 这里我们利用的是中国古代的辗转相除法,关于辗转相除法的思想可以自行百度,我在这里直接贴代码 #include<stdio.h> int gcd(int a, int b){ if (a == 0) return b; return gcd(b %

C语言求最大公约数和最小公倍数算法

其算法过程为:前提:设两数为a,b设其中a 做被除数,b做除数,temp为余数 1.大数放a中.小数放b中: 2.求a/b的余数: 3.若temp=0则b为最大公约数: 4.如果temp!=0则把b的值给a.temp的值给b: 5.返回第第二步: #include <stdio.h> #include <math.h> void main(){ int divisor(int a,int b); int multiple(int a,int b); printf("The

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

最大公约数 1. 用最基本的循环遍历的方法 2. 用辗转相除法 3. 用辗转相减法 See also:  http://baike.baidu.com/view/47637.htm 1 #include<iostream> 2 using namespace std; 3 4 int CommonDivisor( int x, int y); 5 int CommonMultiple(int x, int y); 6 int CommonDivisor1( int x, int y); 7 i