最大公约数和最小公倍数算法实现

 

最大公约数

1. 用最基本的循环遍历的方法

2. 用辗转相除法

3. 用辗转相减法

 

See also:  http://baike.baidu.com/view/47637.htm

 

 1 #include<iostream>
 2 using namespace std;
 3 
 4 int CommonDivisor( int x, int y);
 5 int CommonMultiple(int x, int y);
 6 int CommonDivisor1( int x, int y);
 7 int CommonMultiple2(int x, int y);
 8 int CommonDivisor2(int x, int y);
 9 int getDif(int x, int y);
10 int main()
11 {
12     int a, b;
13     cout << "Please input two integer: ";
14     cin>>a >>b;
15 
16     cout<<CommonDivisor(a,b)<< endl;
17     cout<<CommonMultiple(a,b)<< endl;
18     cout<<"-----------------------------------"<< endl;
19     cout<<CommonDivisor1(a,b)<< endl;
20     cout<<CommonMultiple2(a,b)<< endl;
21 
22     cout<<"-----------------------------------"<< endl;
23     cout<<CommonDivisor2(a,b)<< endl;
24 
25     cout<<endl;
26 
27 }
28 
29 int CommonDivisor1( int x, int y)
30 {
31     //最大公约数一定在1和X和Y较小的值之间,因此从x和y之间较小的值开始循环遍历,找到最大的公约数
32     int start = x;
33     if(x > y)
34         start = y;
35     for (int i = start; i >=1; i--)
36     {
37         if(x % i ==0 && y % i == 0)
38             return i;
39     }
40     return 1;
41 }
42 
43 int CommonDivisor2(int x, int y)
44 {
45     //辗转相减法
46     if(x % 2 ==0 && y % 2 == 0)
47         return 2 * CommonDivisor2(x / 2, y / 2);
48     else
49     {
50         return getDif(x,y);
51     }
52 }
53 
54 int getDif(int x,int y)
55 {
56     int larger = x;
57     int smaller = y;
58     if(x < y)
59     {
60         larger = y;
61         smaller = x;
62     }
63     int dif =  larger - smaller;
64     if(dif == smaller )
65         return dif;
66     else
67         return getDif(smaller, dif);
68 }
69 
70 int CommonDivisor( int x, int y)
71 {
72     //辗转相除法
73     if(x== 0)
74         return y;
75     return CommonDivisor(y %x , x);
76 }
77 int CommonMultiple(int x, int y)
78 {
79     //最小公倍数是x和y的乘积 再除以x和y的最大公约数 所的出来的值
80     int cd = CommonDivisor(x,y);
81     return ((x * y ) / cd);
82 }
83 int CommonMultiple2(int x, int y)
84 {
85     //最小公倍数是的值一定在x和y中较大者和xy乘积之间,所以从小到大遍历找到这个数字
86     int start = x;
87     int end = x * y;
88     if(x < y)
89         start = y;
90     for(int i = y ; y <= end; i++)
91     {
92         if(i % x ==0 && i % y == 0)
93             return i;
94     }
95     return end;
96 }

 

posted @ 2014-11-20 14:23  仰望星辰  阅读(562)  评论(0编辑  收藏  举报