php专区

 首页 > php专区 > PHP进阶 > 算法 > 欧几里德算法(辗转相处法)练手

欧几里德算法(辗转相处法)练手

分享到:
【字体:
导读:
         摘要:欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理:定理:gcd(a,b)gcd(b,amodb)。证明:a可以表示成akb+r,则ramodb。假设d是a,b的一个公约数,则有:a%d0,b%d0,而ra-kb,因此r%d0。因此d是(b,amodb)的公约数。 ...

欧几里德算法(辗转相处法)练手

欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理: 定理:gcd(a,b) = gcd(b,a mod b)。

证明:a可以表示成a = kb + r,则r = a mod b。

假设d是a,b的一个公约数,则有:a % d == 0 , b % d == 0,而r = a - kb,因此 r % d == 0 。因此d是(b,a mod b)的公约数。

假设d 是(b,a mod b)的公约数,则b % d == 0 , r % d == 0 ,但是a = kb +r 所以 a % d == 0。因此d也是(a,b)的公约数。

因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证。欧几里德算法就是根据这个原理来做的。

/*==================================================*
| GCD 最大公约数
*==================================================*/
int gcd(int x, int y)
{
     if (!x || !y) return x > y ? x : y;
     for (int t; t = x % y; x = y, y = t);
    
     return y;
}
/*==================================================*
| 快速 GCD
*==================================================*/
int kgcd(int a, int b)
{
	if (a == 0) return b;
	if (b == 0) return a;
	if (!(a & 1) && !(b & 1)) 
		return kgcd(a>>1, b>>1) << 1;
	else if (!(b & 1)) 
		return kgcd(a, b>>1);
	else if (!(a & 1)) 
		return kgcd(a>>1, b);
	else return 
		kgcd(abs(a - b), min(a, b));
}
/*==================================================*
| 扩展 GCD
| 求x, y使得gcd(a, b) = a * x + b * y;
*==================================================*/
int extgcd(int a, int b, int & x, int & y)
{
	if (b == 0) 
	{ 
		x=1; y=0; 
		return a; 
	}
	int d = extgcd(b, a % b, x, y);
	
	int t = x; x = y; y = t - a / b * y;
	
	return d;
}

本文地址:http://www.nowamagic.net/librarys/veda/detail/213,欢迎访问原出处。

欧几里德算法(辗转相处法)练手
分享到:
面试中常见的一些算法问题
面试中常见的一些算法问题 Problem 1 : Is it a loop ? (判断链表是否有环?) Assume that wehave a head pointer to a link-list. Also assumethat we know the list is single-linked. Can you come up an algorithm to checkwhether this link list includes a loop by using O(n) time and O(1) spac...
二叉搜索树的一些相关算法介绍
二叉搜索树的一些相关算法介绍 二叉搜索树中,左子树值大于根节点,右子树值大于根节点,每一层子树都遵守以上规则。二叉搜索能够大大加快搜索速度,常规的搜索只能一个个比较,算法复杂度为n,二叉搜索树由于其结果特点能够将搜索负载度减小为log(n)。 首先定义二叉树的节点数据结构: struct Tree { struc...
  •         php迷,一个php技术的分享社区,专属您自己的技术摘抄本、收藏夹。
  • 在这里……