題目:求兩個正整數的最大公約數和最小公倍數。
基本要求: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);
}
}