最大公约数的几种写法

 

 

特点及意义

最大公约数指某几个整数共有因子中最大的一个。

GCD即Greatest Common Divisor.

例如,12和30的公约数有:1、2、3、6,其中6就是12和30的最大公约数

两个整数的最大公约数主要有两种寻找方法:

* 两数各分解质因子,然后取出同样有的项乘起来

* 辗转相除法(扩展版)

和最小公倍数(lcm)的关系:gcd(a, b)×lcm(a, b) = ab

两个整数的最大公因子可用于计算两数的最小公倍数,或分数化简成最简分数。

两个整数的最大公因子和最小公倍数中存在分配律:

* gcd(a, lcm(b, c)) = lcm(gcd(a, b), gcd(a, c))

* lcm(a, gcd(b, c)) = gcd(lcm(a, b), lcm(a, c))

在坐标里,将点(0, 0)和(a, b)连起来,通过整数坐标的点的数目(除了(0, 0)一点之外)就是gcd(a, b)。

gcd递归定理及证明

gcd递归定理是指gcd(a,b)=gcd(b,a%b),其中%表示取余数。

证明如下:

我们只需证明gcd(a,b)和gcd(b,a%b)可以互相整除即可。

对于gcd(a,b),它是a和b的线性组合中的最小正元素,gcd(b,a%b) 是b与a%b的一个线性组合,而a%b是a与b的一个线性组合,因而gcd(b,a%b)是一个a与b的线性组合,因为a,b都能被gcd(a,b)整除,因而任何一个a与b的线性组合都能被gcd(a,b)整除,所以gcd(b,a%b)能被gcd(a,b)整除。反之亦然。

 

// gcd.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

int gcd(int a ,int b)
{
	int c = 0;
	if (a < b)
	{
		c = a ;a = b; b= c;//把大的元素放在前面
	}

	for (;a - b >= 0 ;b = a - b,a = c)
	{
		if (a % b == 0)
		{
			return b;
		}
		c = b;

	}

}

unsigned int gcd(unsigned int a,unsigned int b)
{
	int r;
	while(b>0)
	{
		r=a%b;
		a=b;
		b=r;
	}
	return a;
}
unsigned int gcd1(unsigned int a,unsigned int b)
{
	while(b^=a^=b^=a%=b);
	return a;
}

unsigned int gcd2(unsigned int a,unsigned int b)
{
	return (b>0)?gcd(b,a%b):a;
}
int _tmain(int argc, _TCHAR* argv[])
{
	int b = gcd(4,12);
	return 0;
}
时间: 2024-09-19 09:32:06

最大公约数的几种写法的相关文章

C# 单例模式的五种写法

C# 单例模式的五种写法及优劣分析,见下文: [单例模式及常见写法](http://blog.csdn.net/jiankunking/article/details/50867050)

SQL中代替Like语句的另一种写法

比如查找用户名包含有"c"的所有用户, 可以用 use mydatabaseselect * from table1 where username like'%c%" 下面是完成上面功能的另一种写法:use mydatabaseselect * from table1 where charindex('c',username)>0这种方法理论上比上一种方法多了一个判断语句,即>0, 但这个判断过程是最快的, 我想信80%以上的运算都是花在查找字符串及其它的运算上,

DIV高度100%和透明的一种写法

透明 DIV高度100%;DIV透明;的一种写法; 我现在用的是绝对定位;这行删了也可以;  HTML代码<!DOCTYPEhtml PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"&g

在SQL中代替Like语句的另一种写法

语句 比如查找用户名包含有"c"的所有用户, 可以用 use mydatabaseselect * from table1 where username like'%c%" 下面是完成上面功能的另一种写法:use mydatabaseselect * from table1 where charindex('c',username)>0这种方法理论上比上一种方法多了一个判断语句,即>0, 但这个判断过程是最快的, 我想信80%以上的运算都是花在查找字符串及其它的运

Java范型的两种写法

1.原始的DAO层的类: package com.test; public class UserDao { public void add(User user){ //.保存实体的代码 } public User get(int id) { //.查询实体的代码 return null; } } 其中,User类代码比较简单,如下: package com.test; public class User { private int id; private String name; public

Android读写文件的N种写法

Android 读写文件的N种写法(待续...) 读取raw文件 // 读取raw文件 private void rawRead(){ String ret = ""; try { InputStream is = getResources().openRawResource(R.raw.my_raw); int len = is.available(); byte []buffer = new byte[len]; is.read(buffer); ret = EncodingUti

JQuery调用绑定click事件的3种写法

 这篇文章主要介绍了JQuery调用绑定click事件的3种写法,本文简洁清晰的给出3种写法的代码示例,可以很方便的复制使用,需要的朋友可以参考下     第一种方式: ? 1 2 3 4 $(document).ready(function(){ $("#clickme").click(function(){ alert("Hello World click"); }); 第二种方式: ? 1 2 3 $('#clickmebind').bind("cl

select-link中这样两种写法有什么区别?

问题描述 link中这样两种写法有什么区别? var query = from x in table select x; foreach (var item in x) { ... } foreach (var item in table) { ... } 解决方案 两种写法一样,而且性能也一样

状态机的两种写法

有限状态机FSM思想广泛应用于硬件控制电路设计,也是软件上常用的一种处理方法(软 件上称为FMM--有限消息机).它把复杂的控制逻辑分解成有限个稳定状态,在每个状态 上判断事件,变连续处理为离散数字处理,符合计算机的工作特点.同时,因为有限状 态机具有有限个状态,所以可以在实际的工程上实现.但这并不意味着其只能进行有限 次的处理,相反,有限状态机是闭环系统,有限无穷,可以用有限的状态,处理无穷的 事务.     有限状态机的工作原理如图1所示,发生事件(event)后,根据当前状态(cur_st