检测重复小数的算法?
是否有算法来计算以下内容?
如果除法的结果是重复的十进制(二进制)。
如果它重复,那么重复开始的是什么数字(表示为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解释:)。
没有找到相关结果
已邀请:
6 个回复
帆攀缺锯欧
当您达到与第二位相同的值时,该过程将从该点重复,一遍又一遍地产生相同的位模式。从第二位开始重复模式“0011”(小数点分隔符后面的第一位)。 如果您希望模式以“1”开头,则可以旋转它直到它匹配该条件:
编辑: C#中的示例:
用你的例子调用它输出:
为陡土
量华
如果分母中存在两个或五个素因子,则重复部分不在第一个位置开始。
但我不记得如何推导非重复部分及其长度。 这似乎很好地转化为基础二。只有具有2分母幂的分数是非重复的。通过断言分母中只有一个位被设置,可以很容易地检查这一点。
具有奇数分母的所有分数应该是重复的,并且可以通过用具有
形式的分母表示分数来获得模式及其长度。
至于十号基础,我不知道如何处理包含但不是两个幂的分母 - 例如12 =
。
艾食魄轻县
的重复部分是
而不是
,它从小数部分的最开始处开始。 重复的小数是这样的:
其中
和
是你想要的。 例如,
可以用公式表示
因此,
。重复十进制表示的关键部分是通过除以
或其任意倍数2来生成的。因此,您可以找到一种方法来表达您的分母(如构建常量表),或者执行大数除法(这是相对慢)并找到循环。没有快速的方法来做到这一点。
艰管垮淮
郡豪靠暖
中看到用C ++编写的算法。 试试
,它的周期为1776位!