有没有一个算法来搞清楚下列事情?检测重复小数的算法?
- 如果一个除法的结果是一个重复的十进制数(二进制)。
- 如果重复,重复开始的位数是多少(表示为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
有没有办法做到这一点?效率是一个大问题。该算法的描述将优于代码,但我会采取我能得到的答案。
还值得注意的是,基地并不是什么大不了的;我可以将算法转换为二进制(或者如果它在,比如基于256来使用char
s,我可以简单地使用它)。我这样说是因为如果你解释它可能会更容易解释在基地10 :)。
你有更多的条件用于获得结果吗?为什么重复的数字不是“01”,“01”,“10”和“0011”? – Guffa 2009-08-22 09:39:38
@Guffa我的推理是把1放在第一位,因为前导零不是[显着] [1],而尾随零是。如果数字类似于“111.010101 ...”,则重复数字将是“01”,因为在这种情况下,第一个0 *是显着的。 [1]:http://en.wikipedia.org/wiki/Significant_digits – Imagist 2009-08-22 10:19:12
@Guffa(续)这对我来说并不重要。如果你告诉我如何以“01”,“01”,“01”和“0011”的方式做到这一点,我会很高兴。 :) – Imagist 2009-08-22 10:20:47