您的位置:首页 > 编程语言 > Java开发

最大公约数和最小公倍数(java实现)

2013-11-01 10:20 239 查看
     如果数a能被数b整除,a就叫做b的倍数,b就叫做作a的约数.约数和倍数都表示一个数与另一个数的关系,不能单独存在.如只能说16是某数的倍数,2是某数的约数,而不能孤立地说16是倍数,2是约数.

  “倍”与“倍数”是不同的两个概念,“倍”是指两个数相除的商,它可以是整数、小数或者分数.“倍数”只是在数的整除范围内,相对于“约数”而言的一个数字概念,表示的是能被某一个自然数整除的数,它必须是一个自然数.

(1)最大公约数

最大公约数:几个自然数公有的约数,叫做这几个数的公约数;其中最大的一个,叫做这几个数的最大公约数。

例如:12,16的公约数有1,2,4,其中最大的一个是4,4是12与16的最大公约数,一般记为(12,16)=4.12,15,18的最大公约数是3,记为(12,15,18)=3.

常用的求最大公约数的方法是短除法和分解质因数法.

  短除法:开始时用观察比较的方法,即:先把每个数的约数找出来,然后再找出公约数,最后在公约数中找出最大公约数。

例如:求12与18的最大公约数。

  短除法例题

  12的约数有:1、2、3、4、6、12。

  18的约数有:1、2、3、6、9、18。

  12与18的公约数有:1、2、3、6。

  12与18的最大公约数是6。

  这种方法对求两个以上数的最大公约数,特别是数目较大的数,显然是不方便的。于是又采用了给每个数分别分解质因数的方法。

  分解质因数法:把每个数分别分解质因数,再把各数中的全部公有质因数提取出来连乘,所得的积就是这几个数的最大公约数.例如,求24和60的最大公约数.24=2×2×2×3,60=2×2×3×5,24与60的全部公有的质因数是2,2和3,它们的积是2×2×3=12,所以(24,60)=12.

除了这两种方法外,还有一种辗转相除法:

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

两个数求最大公约数,可以用辗转相除法。始终用较大数(被除数)除以较小数(除数),然后用除数代替较大数(被除数),余数代替较小数(除数),代替完后继续让新的被除数除以除数。直到相除余数为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

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

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

(2)最小公倍数

最小公倍数:几个数公有的倍数叫做这几个数的公倍数,其中最小的一个叫做这几个数的最小公倍数。数学上常用方括号表示。如[12,18,20]即12、18和20的最小公倍数。

最小公倍数的求法:

求几个自然数的最小公倍数,同样也可以采用分解质因数法和短除法

<1> 分解质因数法:先把这几个数分解质因数,再把它们一切公有的质因数和其中几个数公有的质因数以及每个数的独有的质因数全部连乘起来,所得的积就是它们的最小公倍数。

例如,求[12,18,20],因为12=2^2×3,18=2×3^2,20=2^2×5,其中三个数的公有的质因数为2,两个数的公有质因数为2与3,每个数独有的质因数为5与3,所以,[12,18,20]=2^2×3^2×5=180。

<2> 短除法:

其实只要求出了最大公约数就能直接求最小公倍数了。可利用下面这条公式

两个数相乘等于这两个数的最大公约数和最小公倍数的积。

java案例:

《1》求两个数的最大公约数和最小公倍数(杭电ACM--1108有类似的题)

解法:用辗转相除法先求出最大公约数,再通过公式:两个数相乘等于这两个数的最大公约数和最小公倍数的积。求出最小公倍数

代码如下:

import java.util.Scanner;

public class Test1018 {

//求最大公约数

public static int commonDivisor(int n,int m){

//辗转相除是用大的除以小的。如果n<m,第一次相当n与m值交换

while(n%m!=0){

int temp=n%m;

n=m;

m=temp;

}

return m;

}

//求最小公倍数

public static int commonMultiple(int n,int m){

return n*m/commonDivisor(n,m);

}

public static void main(String[] args){

Scanner sc=new Scanner(System.in);

int n=sc.nextInt();

int m=sc.nextInt();

System.out.println(commonMultiple(n,m));

System.out.println(commonDivisor(n,m));

}

}

《2》根据用户输入的个数,求出这些数的最小公倍数,以杭电ACM--2028为例

 

Lowest Common Multiple Plus

Problem Description

求n个数的最小公倍数。

 

Input

输入包含多个测试实例,每个测试实例的开始是一个正整数n,然后是n个正整数。

 

Output

为每组测试数据输出它们的最小公倍数,每个测试实例的输出占一行。你可以假设最后的输出是一个32位的整数。

 

Sample Input

2 4 6

3 2 5 7

 

Sample Output

12

70

代码如下:

import java.util.Scanner;

public class Test2028 {

//求两个最大公约数

public static long commonDivisor(long n,long m){

//辗转相除是用大的除以小的。如果n<m,第一次相当n与m值交换

while(n%m!=0){

long temp=n%m;

n=m;

m=temp;

}

return m;

}

//求两个数最小公倍数

public static long commonMultiple(long n,long m){

return n*m/commonDivisor(n,m);

}

//求多个数的最小公倍数

public static long commonMultiple(long[] a){

long value=a[0];

for(int i=1;i<a.length;i++){

value=commonMultiple(value,a[i]);

}

return value;

}

public static void main(String[] args){

Scanner sc=new Scanner(System.in);

while(sc.hasNext()){

int n=sc.nextInt();

long[] a=new long
;

for(int i=0;i<a.length;i++){

a[i]=sc.nextLong();

}

System.out.println(commonMultiple(a));

}

}

}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: