埃及分數 把一個分數分解成n個 m分之一的方式
阿新 • • 發佈:2019-01-06
埃及分數 把一個分數分解成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,顯然是正確的。
【貪心演算法】 設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; } }