貪心法解埃及分數問題
阿新 • • 發佈:2019-01-09
import java.nio.channels.FileChannel.MapMode; import java.util.Scanner; import java.util.Vector; public class Egypt { public static void main(String[] args) { Scanner in=new Scanner(System.in); int choice; int fenzi; int fenmu; do{ System.out.println("----------埃及分數------------"); System.out.println("1.蠻力法"); System.out.println("2.貪心法"); System.out.println("0.退出"); System.out.print("請輸入您的選擇:"); choice=in.nextInt(); switch(choice) { case 1: System.out.print("請輸入真分數的分子和分母:"); fenzi=in.nextInt(); fenmu=in.nextInt(); int[] resultVH=EgyptVeryHard(fenzi,fenmu); PrintResult(resultVH); break; case 2: System.out.print("請輸入真分數的分子和分母:"); fenzi=in.nextInt(); fenmu=in.nextInt(); int[] resultGy=EgyptGreedy(fenzi, fenmu); PrintResult(resultGy); break; case 0: System.out.println("歡迎您的使用~"); break; default: System.out.println("您的輸入有誤,請重新輸入!!!"); } System.out.println(); }while(choice!=0); } //蠻力法求解埃及分數,結果和貪心法一樣 public static int[] EgyptVeryHard(int fenzi, int fenmu) { int i=2; int[] result=new int[fenmu]; int count = 0; while(fenzi!=1) { //如果當前的分數比1/r大,則做差,否則和下一個比較 if(fenzi*i>fenmu) { //做差 fenzi=fenzi*i-fenmu; fenmu=fenmu*i; //約分 int same=getSame(fenmu,fenzi); fenzi=fenzi/same; fenmu=fenmu/same; result[count]=i;count++; i++; } else i++; } //將最後的分母加入 result[count]=fenmu; return result; } //貪心法求解埃及分數 public static int[] EgyptGreedy(int fenzi,int fenmu) { //用一個二維陣列儲存結果,最大是分母個數那麼多個結果 int[] result=new int[fenmu]; int r; int count=0; do{ r=fenmu/fenzi+1; result[count]=r;count++; //分數與1/r做差,並儲存結果 fenzi=fenzi*r-1*fenmu; fenmu=fenmu*r; //將做差後的結果約分 int same=getSame(fenmu,fenzi); fenzi=fenzi/same; fenmu=fenmu/same; }while(fenzi!=1); //將約分最後的一個結果儲存 result[count]=fenmu; return result; } //傳入分母和分子,返回他們的最大公約數 public static int getSame(int a, int b) { int r=a%b; while(r!=0) { a=b; b=r; r=a%b; } return b; } //列印結果 private static void PrintResult(int[] result) { int number=result.length; System.out.println("以下是您埃及分數的結果:"); for(int i=0;i<number;i++) { if(result[i]!=0) System.out.println("1/"+result[i]+" "); } } }