1. 程式人生 > >貪心法解埃及分數問題

貪心法解埃及分數問題

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]+"  ");
		}
	}
}

執行效果: