1. 程式人生 > >埃及分數 把一個分數分解成n個 m分之一的方式

埃及分數 把一個分數分解成n個 m分之一的方式

埃及分數 把一個分數分解成n個 m分之一的形式
【貪心演算法】 設a、b為互質正整數,a<b 分數a/b 可用以下的步驟分解成若干個單位分數之和: 步驟一: 用b 除以a,得商數q1 及餘數r1。(r1=b - a*q1) 步驟二:把a/b 記作:a/b=1/(q1+1)+(a-r)/b(q1+1) 步驟三:重複步驟2,直到分解完畢 3/7=1/3+2/21=1/3+1/11+1/231 13/23=1/2+3/46=1/2+1/16+1/368 以上其實是數學家斐波那契提出的一種求解埃及分數的貪心演算法,準確的演算法表述應該是這樣的: 設某個真分數的分子為a,分母為b; 把b除以a的商部分加1後的值作為埃及分數的某一個分母c; 將a乘以c再減去b,作為新的a; 將b乘以c,得到新的b; 如果a大於1且能整除b,則最後一個分母為b/a;演算法結束; 或者,如果a等於1,則,最後一個分母為b;演算法結束; 否則重複上面的步驟。 備註:事實上,後面判斷a是否大於1和a是否等於1的兩個判斷可以合在一起,及判斷b%a是否等於0,最後一個分母為b/a,顯然是正確的。
import java.util.*;      

 public class Main{      

      public static void main(String[] args) {      

         Scanner scan=new Scanner(System.in);   

         String value=scan.nextLine().trim();  

         System.out.println(ConvertRealFractToEgpytFract(value));  

    }  

 public static String  ConvertRealFractToEgpytFract(String value)  

 {  
     String result="";  

     String s[]=value.split("/");  

     int fenzi=Integer.parseInt(s[0]);  

     int fenmu=Integer.parseInt(s[1]);  

     int div_index;  

     boolean b=true;  

     while(b)  
     if((fenmu)%(fenzi-1)==0)  

         {result=result+"1/"+String.valueOf((fenmu)/(fenzi-1))+"+"+"1/"+String.valueOf(fenmu);  

         b=false;  
         }  
     else{  
         div_index=fenmu/fenzi+1;  
         fenzi=fenzi*div_index-fenmu;  
         fenmu=fenmu*div_index; 
     if(fenmu%fenzi==0)
     { result=result+"1/"+String.valueOf(div_index)+"+"+"1/"+String.valueOf(fenmu/fenzi);
         b=false;
     }
     else
    	result=result+"1/"+String.valueOf(div_index)+"+";  
         }  
     return result;  

 }  
 }