题目:求两个正整数的最大公约数和最小公倍数。
基本要求:1.程序风格良好(使用自定义注释模板),两种以上算法解决最大公约数问题,提供友好的输入输出。
提高要求:1.三种以上算法解决两个正整数最大公约数问题。
2.求3个正整数的最大公约数和最小公倍数。
解题思路:
a.求最大公约数
辗转相减法:取两个数中的最大的数做减数,较小的数做被减数,用最大的数减去小数,如果结果为0,则被减数就是这两个数的最大公约数,如果结果不为0,则继续用这两个数中最大的数减较小的数,直到结果为0,则最大公约数为被减数。程序流程图如下:
程序代码:
/**
* 辗转相除法计算两个数的最大公约数
* @param a:参数一
* @param b:参数二
* @return a和b的最大公约数
* */
public static int greatest1(int a,int b) {
while(a!=b) {
if(a>=b)
a=a-b;
else
b=b-a;
}
return b;
}
辗转相除法:取两个数中最大的数做除数,较小的数做被除数,用最大的数除较小数,如果余数为0,则较小数为这两个数的最大公约数,如果余数不为0,用较小数除上一步计算出的余数,直到余数为0,则这两个数的最大公约数为上一步的余数。程序流程图:
程序代码:
/**
* 辗转相除法计算两个数的最大公约数
* @param r:除以b的余数
* @param a:参数一
* @param b:参数二
* @return a和b的最大公约数
* */
public static int greatest2(int a,int b) {
int r;
while((r=a%b)!=0) {
a=b;
b=r;
}
return b;
}
穷举法:将两个数作比较,取较小的数,以这个数为被除数分别和输入的两个数做除法运算,被除数每做一次除法运算,值减少1,直到两个运算的余数都为0,则该被除数为这两个数的最大公约数。算法流程图:
程序代码:
/**
* 穷举法计算两个数的最大公约数
* @param temp:交换变量
* @param a:参数一
* @param b:参数二
* @return temp:a和b的最大公约数
* */
public static int greatest3(int a,int b) {
int temp=b;
while((a%temp)!=0||(b%temp)!=0) {
temp=a;
a=b;
b=temp;
}
return temp;
}
b.求最小公倍数
算法代码:
/**
* 求最大公倍数的方法
* */
public class Multiple {
public static int multiple(int a,int b) {
return a*b/Greatest.greatest1(a, b);
}
}
测试类:
package www.chenxi.test;
import java.io.IOException;
import java.util.Scanner;
import www.chenxi.domain.Greatest;
import www.chenxi.domain.Multiple;
public class Test {
public static void main(String[] args) throws IOException {
Scanner in = new Scanner(System.in);
System.out.println("请输入第一个数:");
int a = in.nextInt();
System.out.println("请输入第二个数:");
int b = in.nextInt();
System.out.println("辗转相减法所得"+a+"和"+"b"+"的最大公约数为:"+Greatest.greatest1(a, b));
System.out.println("辗转相除法所得"+a+"和"+"b"+"的最大公约数为:"+Greatest.greatest2(a, b));
System.out.println("穷举法法所得"+a+"和"+"b"+"的最大公约数为:"+Greatest.greatest3(a, b));
System.out.println(a+"和"+"b"+"的最小公倍数为:"+Multiple.multiple(a, b));
in.close();
}
}
程序运行截图:
求三个数的最大公约数和最小公倍数:
package www.chenxi.domain;
/**
* 多个数求最小公倍数和最大公约数的方法
* */
public class ManyNum {
public static int greatestMauny(int a,int b,int c) {
int i;
for (i= a; i>0; i-- )
if (a%i==0&&b%i==0&&c%i==0)
break;
return i;
}
public static int multipleMany(int a,int b,int c) {
int i;
for (i= a; ; i++ )
if (i%a==0&&i%b==0&&i% c==0)
break;
return i;
}
}
package www.chenxi.test;
import java.io.IOException;
import java.util.Scanner;
import www.chenxi.domain.ManyNum;
public class Test1 {
public static void main(String[] args) throws IOException {
Scanner in = new Scanner(System.in);
System.out.println("请输入第一个数:");
int a = in.nextInt();
System.out.println("请输入第二个数:");
int b = in.nextInt();
System.out.println("请输入第三个数:");
int c = in.nextInt();
System.out.println(a+","+b+","+c+"的最小公倍数为:"+ManyNum.multipleMany(a, b, c));
System.out.println(a+","+b+","+c+"的最大公约数为:"+ManyNum.greatestMauny(a, b, c));
in.close();
}
}
运行结果: