最大公約數(shù)和最小公倍數(shù)
語(yǔ)言: C, 標(biāo)簽: 無(wú) 2008/07/22發(fā)布 5個(gè)月前更新 更新記錄作者: 半瓶墨水, 點(diǎn)擊5221次, 評(píng)論(0), 收藏者(0), , 打分:登錄以后才能打分, 目前平均0.0分,總分0, 共有0個(gè)用戶參與打分
C語(yǔ)言: 最大公約數(shù)和最小公倍數(shù)
# 以下描述來自: http://baike.baidu.com/view/47637.htm
#
# 最大公約數(shù)(greatest common divisor,簡(jiǎn)寫為gcd;
# 指某幾個(gè)整數(shù)共有公約數(shù)中的最大一個(gè)
# 例: 在2、4、6中,2就是2,4,6的最大公約數(shù)。
#
# 重要性質(zhì):
# gcd(a,b)=gcd(b,a) (交換律)
# gcd(-a,b)=gcd(a,b)
# gcd(a,a)=|a|
# gcd(a,0)=|a|
# gcd(a,1)=1
# gcd(a,b)=gcd(b, a mod b)
# gcd(a,b)=gcd(b, a-b)
# 如果有附加的一個(gè)自然數(shù)m,
# 則: gcd(ma,mb)=m * gcd(a,b) (分配率)
# gcd(a+mb ,b)=gcd(a,b)
# 如果m是a和b的最大公約數(shù),
# 則: gcd(a/m ,b/m)=gcd(a,b)/m
# 在乘法函數(shù)中有:
# gcd(ab,m)=gcd(a,m) * gcd(b,m)
# 兩個(gè)整數(shù)的最大公約數(shù)主要有兩種尋找方法:
# * 兩數(shù)各分解質(zhì)因子,然后取出同樣有的項(xiàng)乘起來
# * 輾轉(zhuǎn)相除法(擴(kuò)展版)
# 和最小公倍數(shù)(lcm)的關(guān)系:
# gcd(a, b) * lcm(a, b) = ab
# a與b有最大公約數(shù),但不一定有最小公倍數(shù)。
# 兩個(gè)整數(shù)的最大公因子可用于計(jì)算兩數(shù)的最小公倍數(shù),或分?jǐn)?shù)化簡(jiǎn)成最簡(jiǎn)分?jǐn)?shù)。
# 兩個(gè)整數(shù)的最大公因子和最小公倍數(shù)中存在分配律:
# * gcd(a, lcm(b, c)) = lcm(gcd(a, b), gcd(a, c))
# * lcm(a, gcd(b, c)) = gcd(lcm(a, b), lcm(a, c))
# 在坐標(biāo)里,將點(diǎn)(0, 0)和(a, b)連起來,通過整數(shù)坐標(biāo)的點(diǎn)的數(shù)目(除了(0, 0)一點(diǎn)之外)就是gcd(a, b)。
#
#
# 以下代碼來自: http://bbs.bccn.net/thread-224663-1-1.html
#
int GCD(int a, int b)
{
if(b == 0) return a;
else return GCD(b, a % b);
}
int LCM(int a, int b)
{
return a * b / GCD(a,b);
}
/*以下代碼來自:http://en.wikipedia.org/wiki/Binary_GCD_algorithm */
unsigned int gcd(unsigned int u, unsigned int v)
{
int shift;
/* GCD(0,x) := x */
if (u == 0 || v == 0)
return u | v;
/* Let shift := lg K, where K is the greatest power of 2
dividing both u and v. */
for (shift = 0; ((u | v) & 1) == 0; ++shift) {
u >>= 1;
v >>= 1;
}
while ((u & 1) == 0)
u >>= 1;
/* From here on, u is always odd. */
do {
while ((v & 1) == 0) /* Loop X */
v >>= 1;
/* Now u and v are both odd, so diff(u, v) is even.
Let u = min(u, v), v = diff(u, v)/2. */
if (u < v) {
v -= u;
} else {
unsigned int diff = u - v;
u = v;
v = diff;
}
v >>= 1;
} while (v != 0);
return u << shift;
}
#
# 最大公約數(shù)(greatest common divisor,簡(jiǎn)寫為gcd;
# 指某幾個(gè)整數(shù)共有公約數(shù)中的最大一個(gè)
# 例: 在2、4、6中,2就是2,4,6的最大公約數(shù)。
#
# 重要性質(zhì):
# gcd(a,b)=gcd(b,a) (交換律)
# gcd(-a,b)=gcd(a,b)
# gcd(a,a)=|a|
# gcd(a,0)=|a|
# gcd(a,1)=1
# gcd(a,b)=gcd(b, a mod b)
# gcd(a,b)=gcd(b, a-b)
# 如果有附加的一個(gè)自然數(shù)m,
# 則: gcd(ma,mb)=m * gcd(a,b) (分配率)
# gcd(a+mb ,b)=gcd(a,b)
# 如果m是a和b的最大公約數(shù),
# 則: gcd(a/m ,b/m)=gcd(a,b)/m
# 在乘法函數(shù)中有:
# gcd(ab,m)=gcd(a,m) * gcd(b,m)
# 兩個(gè)整數(shù)的最大公約數(shù)主要有兩種尋找方法:
# * 兩數(shù)各分解質(zhì)因子,然后取出同樣有的項(xiàng)乘起來
# * 輾轉(zhuǎn)相除法(擴(kuò)展版)
# 和最小公倍數(shù)(lcm)的關(guān)系:
# gcd(a, b) * lcm(a, b) = ab
# a與b有最大公約數(shù),但不一定有最小公倍數(shù)。
# 兩個(gè)整數(shù)的最大公因子可用于計(jì)算兩數(shù)的最小公倍數(shù),或分?jǐn)?shù)化簡(jiǎn)成最簡(jiǎn)分?jǐn)?shù)。
# 兩個(gè)整數(shù)的最大公因子和最小公倍數(shù)中存在分配律:
# * gcd(a, lcm(b, c)) = lcm(gcd(a, b), gcd(a, c))
# * lcm(a, gcd(b, c)) = gcd(lcm(a, b), lcm(a, c))
# 在坐標(biāo)里,將點(diǎn)(0, 0)和(a, b)連起來,通過整數(shù)坐標(biāo)的點(diǎn)的數(shù)目(除了(0, 0)一點(diǎn)之外)就是gcd(a, b)。
#
#
# 以下代碼來自: http://bbs.bccn.net/thread-224663-1-1.html
#
int GCD(int a, int b)
{
if(b == 0) return a;
else return GCD(b, a % b);
}
int LCM(int a, int b)
{
return a * b / GCD(a,b);
}
/*以下代碼來自:http://en.wikipedia.org/wiki/Binary_GCD_algorithm */
unsigned int gcd(unsigned int u, unsigned int v)
{
int shift;
/* GCD(0,x) := x */
if (u == 0 || v == 0)
return u | v;
/* Let shift := lg K, where K is the greatest power of 2
dividing both u and v. */
for (shift = 0; ((u | v) & 1) == 0; ++shift) {
u >>= 1;
v >>= 1;
}
while ((u & 1) == 0)
u >>= 1;
/* From here on, u is always odd. */
do {
while ((v & 1) == 0) /* Loop X */
v >>= 1;
/* Now u and v are both odd, so diff(u, v) is even.
Let u = min(u, v), v = diff(u, v)/2. */
if (u < v) {
v -= u;
} else {
unsigned int diff = u - v;
u = v;
v = diff;
}
v >>= 1;
} while (v != 0);
return u << shift;
}