【发布时间】:2010-11-21 21:12:22
【问题描述】:
有没有一种算法可以解决以下问题?
- 如果除法的结果是重复的小数(二进制)。
- 如果重复,从哪个数字(表示为 2 的幂)开始?
- 哪些数字重复?
一些例子:
1/2 = 1/10 = 0.1 // 1 = false, 2 = N/A, 3 = N/A, 4 = N/A
1/3 = 1/11 = 0.010101... // 1 = true, 2 = -2, 3 = 10
2/3 = 10/11 = 0.101010... // 1 = true, 2 = -1, 3 = 10
4/3 = 100/11 = 1.010101... // 1 = true, 2 = 0, 3 = 10
1/5 = 1/101 = 0.001100110011... // 1 = true, 2 = -3, 3 = 1100
有没有办法做到这一点?效率是一个大问题。算法的描述比代码更受欢迎,但我会接受我能得到的答案。
还值得注意的是,基地并不是什么大问题。我可以将算法转换为二进制(或者如果它在,比如 base 256 以方便使用chars,我可以使用它)。我这样说是因为如果你在解释,你可能会更容易在 base 10 中解释:)。
【问题讨论】:
-
您还使用了哪些条件来获得结果?为什么不重复“01”、“01”、“10”和“0011”的数字?
-
@Guffa 我的理由是把 1 放在第一位,因为前导零不是 [显着][1],而尾随零是。如果数字类似于“111.010101...”,则重复数字将是“01”,因为在这种情况下,第一个 0 很重要。 [1]:en.wikipedia.org/wiki/Significant_digits
-
@Guffa(续) 不过这对我来说并不重要。如果您告诉我如何以返回“01”、“01”、“01”和“0011”的方式执行此操作,我会很高兴。 :)
-
听起来像projecteuler.net/problem=26 ;-)
标签: algorithm rational-numbers