最大公约数的三种实现方式
方式一:列举法
- 主要思路:
设置一个变量i使i的初始值为两个数较小的那一个,判断这两个数能否被i整除,能整除则返回最大公约数i,不能整除i让i–,再次进行判断,最终如果i=1,则两个数互质,流程图如图一所示。
方式二:相减法
主要思路:
输入的两个数当num1与num2不相等时,如果num1> num2,则num1=num1-num2,否则num2=num2-num1,反复进行上述过程,直到num1=num2,此时如果num1=1,说明两个数互为质数,否则为两个数的最大公约数。流程图如图二所示。
代码实现
/**
*
* @Title: getCommonDivisor1
* @Description: 列举法求最大公约数
* @return int:返回最大公约数
* @author Administrator
* @date 2018年9月5日下午8:49:28
*/
public static int getCommonDivisor1() {
System.out.println("请输入两个数:");
int num1 = sc.nextInt();
int num2 = sc.nextInt();
if( num1 > num2) {
int temp = num1;
num1 = num2;
num2 = temp;
}
for(int i=num2;i>=1;i--) {
if(num2%i==0&&num1%i==0) {
return i;
}
}
return 1;//返回1表示两数互质
}
/**
*
* @Title: getCommonDivisor3
* @Description: 相减法求最大公约数
* @return int 返回最大公约数
* @author Administrator
* @date 2018年9月5日下午8:54:45
*/
public static int getCommonDivisor3() {
System.out.println("请输入两个数:");
int num1 = sc.nextInt();
int num2 = sc.nextInt();
while(num2!=num1) {
if(num1>num2)
num1=num1-num2;
else if(num2>num1)
num2 = num2-num1;
}
return num1;
}
/**
*
* @Title: getCommonDivisor3
* @Description: 重载相减法求最大公约数方法
* @param num1 参数之一
* @param num2 参数之二
* @return int
* @author Administrator
* @date 2018年9月5日下午9:17:13
*/
public static int getCommonDivisor3(int num1,int num2) {
while(num2!=num1) {
if(num1>num2)
num1=num1-num2;
else if(num2>num1)
num2 = num2-num1;
}
return num1;
}
方式三:辗转相除法
主要思路:
用户输入的两个数num1,num2(num1 < num2)设置一个变量temp,temp=num2%num1,当temp>0时num2=num1,num1=temp,temp=num2%num1。最终得到的temp如果为1则说明两个数相互为质数,否则temp为二者的最大公约数,流程图如下图所示。
代码实现
/**
*
* @Title: getCommonDivisor2
* @Description: 辗转相除法求最大公约数
* @return int 返回最大公约数
* @author Administrator
* @date 2018年9月5日下午8:53:32
*/
public static int getCommonDivisor2() {
System.out.println("请输入两个数:");
int num1 = sc.nextInt();
int num2 = sc.nextInt();
if( num1 > num2) {
int temp = num1;
num1 = num2;
num2 = temp;
}
int temp =num2%num1;
while(temp>0) {
num2=num1;
num1=temp;
temp=num2%num1;
}
return num1;
}
求三个数的最大公约数与最小公倍数
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
/**
*
* @ClassName: MaxCommonDivisorOfThreeNum
* @Description: 求三个数的最大公约数和最小公倍数
* @author: Administrator
* @date: 2018年9月5日 下午8:55:31
*/
public class MaxCommonDivisorOfThreeNum{
static Scanner sc = new Scanner(System.in);
/**
*
* @Title: getCommonDivisorOfThreeNum
* @Description: 求三个数的最大公约数,第二个值为最小公倍数
* @return int[] 第一个值代表最大公约数,第二个值为最小公倍数
* @author Administrator
* @date 2018年9月5日下午8:55:50
*/
public static int[] getCommonDivisorOfThreeNum() {
System.out.println("请输入三个数:");
int num1 = sc.nextInt();
int num2 = sc.nextInt();
int num3 = sc.nextInt();
int [] result=new int[2];// 第一个值代表最大公约数,第二个值为最小公倍数
List<Integer> sortList = new ArrayList<Integer>();//使用集合方便对三个数进行排序
sortList.add(num1);
sortList.add(num2);
sortList.add(num3);
Collections.sort(sortList);//将三个参数进行排序
int temp = MaxCommonDivisorOfTwoNum.getCommonDivisor3(num1, num2);//先求两个数的最大公约数
result[0] = MaxCommonDivisorOfTwoNum.getCommonDivisor3(temp, num3);//求第三个数公共的最大公约数
for(int i=sortList.get(2);;i++) {//使用列举法求最小公倍数
if(i%num1==0&&i%num2==0&&i%num3==0) {
result[1]=i;
break;
}
}
return result; //返回结果
}
}
主类进行测试
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("1.列举法求两个数的最大公约数");
System.out.println("2.辗转相除发求两个数的最大公约数");
System.out.println("3.相减法求两个数的最大公约数");
System.out.println("4.求三个数的最大公约数和最小公倍数");
System.out.println("0:退出");
System.out.println("请选择:");
String op = sc.next();
if (op.equals("0")) {
System.out.println("再见!");
break;
}
switch (op) {
case "1"://测试列举法
int res1 = MaxCommonDivisorOfTwoNum.getCommonDivisor1();
System.out.println(res1 == 1 ? "互为质数" : "最大公约数为:" + res1);
break;
case "2"://测试辗转相除法
int res2 = MaxCommonDivisorOfTwoNum.getCommonDivisor1();
System.out.println(res2== 1 ? "互为质数" : "最大公约数为:" + res2);
break;
case "3"://测试相减法
int res3 = MaxCommonDivisorOfTwoNum.getCommonDivisor1();
System.out.println(res3 == 1 ? "互为质数" : "最大公约数为:" + res3);
break;
case "4"://测试三个数的最大公约数和最小公倍数res4数组的第一个为最大公约数情况,第二个数为最小公倍数
int[] res4 = MaxCommonDivisorOfThreeNum.getCommonDivisorOfThreeNum();
System.out.print(res4[0] == 1 ? "互为质数" : "最大公约数为:" + res4[0]);
System.out.println( " 最小公倍数为:" + res4[1]);
break;
default:
System.out.println("输入错误");
}
}
}
}