题解 | #将真分数分解为埃及分数#
将真分数分解为埃及分数
https://www.nowcoder.com/practice/e0480b2c6aa24bfba0935ffcca3ccb7b
这应该是一道数学题,通过简单的推导可知,对于一个真分数a/b:
1、如果b%a=0,那显然可以直接转换成一个埃及分数
2、如果b%a !=0,那么我们应该找到一个与a/b足够接近且小于a/b的埃及分数1/k,即1/(k-1)<a/b<1/k,此时二者的差值为a/b-1/k=(a*k-b)/(b*k)
3、对于这个新的真分数(a*k-b)/(b*k),取a=a*k-b,b=b*k,重复上面两步进行迭代,直至b%a=0
tips:b和a应该设为long型,以便有足够多的迭代空间,尽可能的得到结果
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNextLine()) { String line = sc.nextLine(); String[] s = line.split("/"); long a = Integer.parseInt(s[0]); long b = Integer.parseInt(s[1]); if (b % a == 0) { //b与a是倍数关系,可直接转换成埃及分数 b = b / a; a = 1; System.out.println(a + "/" + b); } else { //b与a不是倍数关系,找到与其最接近的埃及分数1/k,并取二者差值进行迭代 StringBuilder sb = new StringBuilder(); while (b % a != 0) { long k = b / a + 1; a = a * k - b; b = b * k; sb.append(1 + "/" + k + "+"); } b = b / a; a = 1; sb.append(a + "/" + b); System.out.println(sb); } } } }