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

短除法:
#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 min;
		}
		min--;
	}
	return 1;
}
int main()
{
	int num1 = 0;
	int num2 = 0;
	int ret = 0;
	scanf("%d%d", &num1,&num2);
	ret=max_approximate(num1, num2);
	printf("%d\n", ret);
	system("pause");
	return 0;
}

辗转相除法:
#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 r = num2%num1;
	while (r != 0)
	{
		num2 = num1;
		num1 = r;
		r = num2%num1;
	}
	return num1;
}
int main()
{
	int num1 = 0;
	int num2 = 0;
	int ret = 0;
	scanf("%d%d", &num1, &num2);
	ret = max_approximate(num1, num2);
	printf("%d\n", ret);
	system("pause");
	return 0;
}

更相减损法:
#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 r = num2-num1;
	while (r != num1)
	{
		if (num1>r)
		{
			num2 = num1;
			num1 = r;
		}
		else
		{
			num2 = r;
		}
		r = num2-num1;
	}
	return num1;
}
int main()
{
	int num1 = 0;
	int num2 = 0;
	int ret = 0;
	scanf("%d%d", &num1, &num2);
	ret = max_approximate(num1, num2);
	printf("%d\n", ret);
	system("pause");
	return 0;
}

1.辗转相除法

算法:就是用大数除小数,如果余数不是零,就把余数和较小的数构成一组新数,继续上面的除法,知道大数被小数约尽,此时比较小的数就是最大公约数

2. 更相减损法:

第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。

第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。

则第一步中约掉的若干个2与第二步中等数的乘积就是所求的最大公约数。

其中所说的“等数”,就是最大公约数。求“等数”的办法是“更相减损”法。所以更相减损法也叫等值算法。

3. 辗转相除法与更相减损术的区别

(1)都是求最大公因数的方法,计算上辗转相除法以除法为主,更相减损术以减法为主,计算次数上辗转相除法计算次数相对较少,特别当两个数字大小区别较大时计算次数的区别较明显。

(2)从结果体现形式来看,辗转相除法体现结果是以相除余数为0则得到,而更相减损术则以减数与差相等而得到。

4、求最小公倍数

两个数的最大公约数与最小公倍数的乘积就是这两个数的乘积,所以求最小公倍数可以转化为求最大公因数。

时间: 2024-11-08 23:06:16

求最大公约数的算法以及最小公倍数的相关文章

[转]求最大公约数的算法

更相减损术 更相减损术,又称"等值算法" 关于约分问题,实质是如何求分子,分母最大公约数的问题.<九章算术>中介绍了这个方法,叫做”更相减损术”,数学家刘徽对此法进行了明确的注解和说明,是一个实用的数学方法. 例:今有九十一分之四十九,问约之得几何? 我们用(91,49)表示91和49的最大公约数.按刘徽所说,分别列出分子,分母. “以少减多,更相减损,求其等也,以等数约之,等数约之,即除也,其所以相减者皆等数之重叠,故以等数约之.” 译文如下: 约分的法则是:若分子.分母

两非负整数求最大公约数(欧几里德算法)---C/C++

#include<iostream> using namespace std; //欧几里德算法求两个非负整数的最大公约数 int getDivisor(int a,int b) { int max,min; max = a; min = b; //两数中大数模小数,若结果不为0,则舍弃大数 ,把小数和模运算的结果分出大小来,继续取模运算 //依次递归求解,直到模运算结果为0,则此时的小数就是最大公约数 if(max%min!=0){ if(max%min>min) return get

关于C/C++中求最大公约数的算法

1.更相减损法 int gcd(int a,int b) { while(a!=b) { if(a>b) a-=b; else b-=a; } return a; } 2.辗转相除法--递归 int gcd(int a,int b) { if(b==0) return a; else return gcd(b,a%b); } 3.辗转相除法--纯循环 int gcd(int a,int b) { int r; while(b!=0) { r=a%b; a=b; b=r; } return a;

欧几里得求最大公约数

问题:快速求取正整数a,b的最大公约数? 欧几里得算法(又称辗转相除法) 定理:gcd(a,b) = gcd(a,a mod b) 证明:对于任何正整数a,b.如果a>b,都有a=k*b+r  即r=a-k*b =>  r=a mod b. 假设d为a,b的公约数,则a=a1*d,b=b1*d. 而r=a1*d-k*b1*d=(a1-k*b1)*d  =>  d也是r的约数 => d也是(a,r)的公约数 则说明(a,b)的公约数也就是(a,r)的公约数.因此gcd(a,b)=gc

求最大公约数 和 最小公倍数 常见算法

#include <stdio.h>int main(){ int a,b,t,c,m,n; scanf("%d%d",&a,&b); m=a; n=b; //1.辗转相除法求最大公约数 /*while(b!=0) { c = a%b; a = b; b = c; } printf("最大公约数: %d\n",a);//最大公约数 printf("最小公倍数: %d\n",m*n/a);//最小公倍数 */ //2.相

辗转相除 求最大公约数!or 最小公倍数

求最大公约数和最小公倍数的经典算法--辗转相除法描述如下: 若要求a,b两数的最大公约数和最小公倍数,令a为a.b中较大数,b为较小数,算法进一步流程: while(b不为0) { temp=a%b: a=b: b=temp } 最后a即为两数的最大公约数,最大公倍数为: a*b/最大公约数 c语言代码: 01.int divisor (int a,int b) /*自定义函数求两数的最大公约数*/ 02.{ 03. int temp; /*定义整型变量*/ 04. if(a<b) /*通过比较

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

求最大公约数和最小公倍数 假设有两个数a和b,求a,b的最大公约数和最小公倍数实际上是一个问题,得出这两个数的最大公约数就可以算出它们的最小公倍数. 最小公倍数的公式是 a*b/m m为最大公约数 因为 a=m*i; b=m*j; 最小公倍数为 m*i*j 那么,下面就开始计算a和b的最大公约数. 更相损减法: <九章算術·方田>作分數約簡時,提到求最大公因數方法:反覆把兩數的較大者減去較小者,直至兩數相等,這數就是最大公因數.這方法除了把除法換作減法外,與輾轉相除法完全相同.例如書中求91和

奇葩的求最大公约数、最小公倍数、分解质因数的做法(C语言)

奇葩的求最大公约数.最小公倍数.分解质因数的做法(C语言) 1 /* 2 最奇葩的求最大公约数与最小公倍数 3 create by laog 4 time 2017年7月27日12:23:14 5 */ 6 7 //两个数的最大公约数 8 //两个数的最小公倍数 9 //将一个正整数分解质因数 --和 2.3.5取余 10 11 #include <stdio.h> 12 13 int main1() 14 { 15 // 3,4 16 //20 17 int v; 18 scanf(&quo

欧几里得算法求最大公约数+最小公倍数

1,两个数互质:如果说两个数的公因数只有1,则可以说这两个数互质. 欧几里得算法求最大公约数: 首先求最大公约数,假设我们要求a和b的最大公约数 设a mod b = c: 可以得到一下的递推过程: a = kb + c ; 假设a , b 的最大公约数为d,则可以得到: a = md , b = nd; 可知m , n 互质: c = a - kb = md - knd = (m-kn)d; 我们已经知道m,n互质,则可以知道n和m-kn互质,则c和b的最大公约数也是d; 所以由以上的推论,我