求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 }