题目:求两个正整数的最大公约数和最小公倍数。
基本要求:1.程序风格良好(使用自定义注释模板),两种以上算法解决最大公约数问题,提供友好的输入输出。
提高要求:1.三种以上算法解决两个正整数最大公约
数问题。
2.求3个正整数的最大公约数和最小公倍数。
思路:
首先明确怎样求两个正整数的最大公约数和最小公倍数。
最大公约数:
1.辗转相除法:又名欧几里德算法。辗转相除法的核心就是不断的让两个数做除法运算。
其原理基于两个整数的最大公约数等于其中较小的数和两数的相除余数的最大公约数。
2.辗转相减法:辗转相减法即通过对两数的不断减法运算。
例如 :两个自然数35和14,用大数减去小数,(35,14)->(21,14)->(7,14),此时,7小于14,要做一次交换,把14作为被减数,即(14,7)->(7,7),再做一次相减,结果为0,这样也就求出了最大公约数7
3.递归法
最小公倍数:两个数的最小公倍数等于两个数相乘除以最大公约数。
求三个数的最大公约数只需要先求两个数的最大公约数,然后再用求出的最大公约数和第三个数求最大公约数。
三个数的最大公倍数原理同上。
调试:
调试过程中主要遇到的问题是当用户想选择求两个数或三个数时的选择界面,本来的构思是根据用户输入几个数字来判断执行求两个数的方法还是求三个数的方法,但实际操作起来不是很好判断,于是我用了a来保存用户输入的数字2或3,然后根据数字来选择不同的显示界面。
用swicth语句来判断求几个数的最大公约数和最小公倍数,还可以用if语句判断。
还有其他一些拼写错误的问题,不一一赘述。
代码如下:
/**
* @author LEMON
* @time 2018/9/6
* */
package homework1;
import java.util.Scanner;
public class Homework2 {
public static void main(String [] args){
Scanner sc = new Scanner(System.in); //用键盘输入数据
System.out.println("您要求两个数还是三个数的最大公约数?");
int a=sc.nextInt();
switch (a) { //switch语句 用来判断当a=2时,求两个数的最大公约数和最小公倍数,a=3时,则求三个数的。
case 2:{
System.out.println("请输入第一个整数");
int x= sc.nextInt();
System.out.println("请输入第二个整数");
int y= sc.nextInt();
System.out.println("最大公约数方法一的结果:"+maxCommonDivisor1(x,y));
System.out.println("最大公约数方法二的结果:"+maxCommonDivisor2(x,y));
System.out.println("最大公约数方法三的结果:"+maxCommonDivisor3(x,y));
System.out.println("最小公倍数为:"+minCommonMultiple(x,y));
break;}
case 3:{
System.out.println("请输入第一个整数");
int x= sc.nextInt();
System.out.println("请输入第二个整数");
int y= sc.nextInt();
System.out.println("请输入第三个整数:");
int z= sc.nextInt();
System.out.println("最大公约数为:"+mcd3(x, y, z));
System.out.println("最小公倍数为:"+mcm3(x,y,z));
break;}
}
}
/**
* 辗转相除法:又名欧几里德算法。辗转相除法的核心就是不断的让两个数做除法运算。
* 其原理基于两个整数的最大公约数等于其中较小的数和两数的相除余数的最大公约数。
**/
public static int maxCommonDivisor1(int x,int y){
int a,b,c,temp;
a=x;
b=y;
if (a<b){ //如果a<b,则调换位置。
temp=a;
a=b;
b=temp;
}
while(a%b!=0){ //当a除以b的余数不等于0,将较小的数取出来除以余数
c=a%b;
a=b;
b=c;
}
return b;
}
/**
* 递归法,当a除以b余数不为0时,递归该方法,直到算出最大公约数。
*/
public static int maxCommonDivisor2(int x,int y){
int a,b,temp;
a=x;
b=y;
if (a<b){ //当a<b时,调换位置
temp=a;
a=b;
b=temp;
}
if(a%b==0){ //当a除以b的余数等于0时,说明b就是最大公约数
return b;
}
else{
return maxCommonDivisor2(a,a%b); //递归
}
}
/**
*
* @param x
* @param y
* @return 0
* 辗转相减法:辗转相减法即通过对两数的不断减法运算。
直至 x = y 时,终止。
*/
public static int maxCommonDivisor3(int x,int y){
while(x!=y){
if(x>y){
x=x-y;
}
else{
y=y-x;
}
}
return x;
}
/**
* 最小公倍数:两个数的最小公倍数等于两个数相乘除以最大公约数
* */
public static int minCommonMultiple(int x ,int y){
return x*y/maxCommonDivisor1(x,y);
}
/**
* 求三个数的最大公约数只需要先求两个数的最大公约数,然后再用求出的最大公约数和第三个数求最大公约数。
* */
public static int mcd3(int x,int y,int z){
return maxCommonDivisor1(maxCommonDivisor1(x, y),z);
}
/**
* 求三个数的最小公倍数只需要先求出两个数的最小公倍数,然后再用求出来的最小公倍数和第三个数求最小公倍数。
* */
public static int mcm3(int x,int y,int z){
return minCommonMultiple(minCommonMultiple(x,y),z);
}
}