古埃及人只使用1/n
形式的分数,因此任何其他分数必须表示为这些单位分数的总和,而且,所有单位分数都不同!
在C或java中使任何分数成为埃及分数(越少越好)的好方法是什么,可以使用什么算法,分支和绑定,a *?
例如:
3/4 = 1/2 + 1/4
6/7 = 1/2 + 1/3 + 1/42
答案 0 :(得分:8)
一种方法是贪心算法。给定分数f
,找到小于或等于1/n
的最大埃及分数f
(即,n = ceil(1 / f))。然后重复余下的f - 1/n
,直到f == 0
。
所以对于3/4,你要计算:
6/7:
答案 1 :(得分:3)
我是如何提出这些价值观的? 好吧,我估计了分数 最大的单位分数 只比给定的分数小。 我减去了这个单位分数 给定的分数。如果剩下这个 我仍然不是单位分数 重复这个过程,选择了 最小的单位分数 比这个剩余。而这个过程 可以一遍又一遍地重复。
我们以7/8为例。我们 估计7/8与2/3(最大的 单位分数小于7/8)。我们 减去7/8 - 2/3,即5/24, 这不能简化成一个单位 分数。所以我们用1/5估计5/24 (最大单位分数小于 5/24)。我们减去5 / 24-1 / 5,我们 得到1/120,这是一个单位分数。 所以,7/8 = 2/3 + 1/5 + 1/120。
答案 2 :(得分:2)
对于a / b
,请将MAX设为a * b。
取MAX的素数因子(这是prime_fac(a)和prime_fac(b)的并集以及这两个列表中的每一个的倍数)并迭代它们,从低位开始变为高位。
这些是您可能的1 / x。
编辑:
哦耶!不要忘记考虑2/3
!
答案 3 :(得分:1)
您在网站上提问,人们通常在答案中提供代码。代码没有其他答案,C和Java不是我的专长,因此这里有一些Python代码。
#! /usr/bin/env python3
import fractions
import functools
import math
def main():
f = fractions.Fraction(3, 4)
e = to_egyptian_fractions(f)
print(*e, sep=' + ')
f = fractions.Fraction(6, 7)
e = to_egyptian_fractions(f)
print(*e, sep=' + ')
f = fractions.Fraction(7654, 321)
e = to_egyptian_fractions(f)
print(*e, sep=' + ')
def validate(function):
@functools.wraps(function)
def wrapper(fraction):
total = fractions.Fraction(0)
for egyptian in function(fraction):
if 1 not in {egyptian.numerator, egyptian.denominator}:
raise AssertionError('function has failed validation')
yield egyptian
total += egyptian
if total != fraction:
raise AssertionError('function has failed validation')
return wrapper
@validate
def to_egyptian_fractions(fraction):
quotient = math.floor(fraction.numerator / fraction.denominator)
if quotient:
egyptian = fractions.Fraction(quotient, 1)
yield egyptian
fraction -= egyptian
while fraction:
quotient = math.ceil(fraction.denominator / fraction.numerator)
egyptian = fractions.Fraction(1, quotient)
yield egyptian
fraction -= egyptian
if __name__ == '__main__':
main()
也许其他人在编写自己的实现时发现这对于作为简单指南很有用。上面的程序处理值大于1的分数并产生以下输出。
1/2 + 1/4
1/2 + 1/3 + 1/42
23 + 1/2 + 1/3 + 1/92 + 1/29532