求N个数的最大公倍数

思路:根据辗转相除法。先求出前两个数n1与n2的最大公约数,再根据公式最小公倍数=n1*n2/最大公约数,然后最小公倍数继续与第三个数进行求最小公倍数。

 

在数学中,辗转相除法,又称欧几里得算法,是求最大公约数的算法。

两个数求最大公约数,可以用辗转相除法。始终用较大数(被除数)除以较小数(除数),然后用除数代替较大数(被除数),余数代替较小数(除数),代替完后继续让新的被除数除以除数。直到相除余数为0时。最后的除数就是最大公约数。举例:
222 407求最大公约数:
222 407(407除以222余数185)
222 185(222除以185余数37)
37 185(185除以37余数0)
所以最大公约数为37
39 24求最大公约数
39 24(39/24,余数15)
15 24(24/15,余数9)
15 9(15/9,余数6)
6 9(9/6,余数3)
6 3(6/3,余数0)
所以最大公约数为3

辗转相除法可以用来计算两个自然数的最大公约数,那若要计算多个自然数的最大公约数呢?

答:求几个自然数的最大公约数,可以先求出其中两个数的最大公约数,再求这个最大公约数与第三个数的最大公约数,依次求下去,直到最后一个为止。最后所得的那个最大公约数,就是所求的几个数的最大公约数。 (求多个数的最小公倍数时也是同样的道理

 1 import java.util.Scanner;
 2 
 3 public class Main {
 4     // 求两个最大公约数
 5     public static long commonDivisor(long n, long m) {
 6         // 辗转相除是用大的除以小的。如果n<m,第一次相当n与m值交换
 7         while (n % m != 0) {
 8             long temp = n % m;
 9             n = m;
10             m = temp;
11         }
12         return m;
13     }
14 
15     // 求两个数最小公倍数
16     public static long commonMultiple(long n, long m) {
17         return n * m / commonDivisor(n, m);
18     }
19 
20     // 求多个数的最小公倍数
21     public static long commonMultiple(long[] a) {
22         long value = a[0];
23         for (int i = 1; i < a.length; i++) {
24             value = commonMultiple(value, a[i]);
25         }
26         return value;
27     }
28 
29     public static void main(String[] args) {
30         Scanner sc = new Scanner(System.in);
31         while (sc.hasNext()) {
32             int n = sc.nextInt();
33             long[] a = new long[n];
34             for (int i = 0; i < a.length; i++) {
35                 a[i] = sc.nextLong();
36             }
37             System.out.println(commonMultiple(a));
38         }
39     }
40 }

 

posted @ 2016-04-10 15:45  crazybuddy  阅读(894)  评论(0编辑  收藏  举报