比这篇新的文章: UIApplication.h中关于UIApplicationMain的定义
比这篇旧的文章: Javascript: IE和Firefox下都有效的“收藏本站”代码

最大公约数和最小公倍数

语言: C, 标签: 无  2008/07/22发布 10个月前更新 更新记录
作者: 半瓶墨水, 点击5682次, 评论(0), 收藏者(0), , 打分:

背景
主题: 字体:
01 # 以下描述来自: http://baike.baidu.com/view/47637.htm
02 #
03 # 最大公约数(greatest common divisor,简写为gcd;
04 # 指某几个整数共有公约数中的最大一个
05 #  例: 在2、4、6中,2就是2,4,6的最大公约数。
06 #
07 # 重要性质:
08 # gcd(a,b)=gcd(b,a) (交换律)
09 # gcd(-a,b)=gcd(a,b)
10 # gcd(a,a)=|a|
11 # gcd(a,0)=|a|
12 # gcd(a,1)=1
13 # gcd(a,b)=gcd(b, a mod b)
14 # gcd(a,b)=gcd(b, a-b)
15 # 如果有附加的一个自然数m,
16 # 则: gcd(ma,mb)=m * gcd(a,b) (分配率)
17 # gcd(a+mb ,b)=gcd(a,b)
18 # 如果m是a和b的最大公约数,
19 # 则: gcd(a/m ,b/m)=gcd(a,b)/m
20 # 在乘法函数中有:
21 # gcd(ab,m)=gcd(a,m) * gcd(b,m)
22 # 两个整数的最大公约数主要有两种寻找方法:
23 # * 两数各分解质因子,然后取出同样有的项乘起来
24 # * 辗转相除法(扩展版)
25 # 和最小公倍数(lcm)的关系:
26 # gcd(a, b) * lcm(a, b) = ab
27 # a与b有最大公约数,但不一定有最小公倍数。
28 # 两个整数的最大公因子可用于计算两数的最小公倍数,或分数化简成最简分数。
29 # 两个整数的最大公因子和最小公倍数中存在分配律:
30 # * gcd(a, lcm(b, c)) = lcm(gcd(a, b), gcd(a, c))
31 # * lcm(a, gcd(b, c)) = gcd(lcm(a, b), lcm(a, c))
32 # 在坐标里,将点(0, 0)和(a, b)连起来,通过整数坐标的点的数目(除了(0, 0)一点之外)就是gcd(a, b)。
33 #
34 #
35 # 以下代码来自: http://bbs.bccn.net/thread-224663-1-1.html
36 #
37 int GCD(int a, int b)
38 {
39    if(b == 0) return a;
40    else return GCD(b, a % b);
41 }
42
43 int LCM(int a, int b)
44 {
45    return a * b / GCD(a,b);
46 }
47
48 /*以下代码来自:http://en.wikipedia.org/wiki/Binary_GCD_algorithm */
49 unsigned int gcd(unsigned int u, unsigned int v)
50 {
51     int shift;
52
53     /* GCD(0,x) := x */
54     if (u == 0 || v == 0)
55         return u | v;
56
57     /* Let shift := lg K, where K is the greatest power of 2
58        dividing both u and v. */
59     for (shift = 0; ((u | v) & 1) == 0; ++shift) {
60         u >>= 1;
61         v >>= 1;
62     }
63
64     while ((u & 1) == 0)
65         u >>= 1;
66
67     /* From here on, u is always odd. */
68     do {
69         while ((v & 1) == 0)  /* Loop X */
70             v >>= 1;
71
72         /* Now u and v are both odd, so diff(u, v) is even.
73            Let u = min(u, v), v = diff(u, v)/2. */
74         if (u < v) {
75             v -= u;
76         } else {
77             unsigned int diff = u - v;
78             u = v;
79             v = diff;
80         }
81         v >>= 1;
82     } while (v != 0);
83
84     return u << shift;
85 }


所有评论,共0条:( 我也来说两句)


发表评论

注册登录后再发表评论