可能重复:
如何知道分数中的重复小数?
1/3 与 3/10 不同。0.33333 != 0.3
所以 1/3 将是 0.3(第三行上方有一行)
1/12 = 0.833333 = 0.083(三号上方有一行)
1/13 = 0.076923076923 = 0.|076923|
这些线代表重复部分。
我计划在课堂上使用这个模型。我对这种情况有点迷茫。我只需要一些想法来确定重复值。谢谢。
可能重复:
如何知道分数中的重复小数?
1/3 与 3/10 不同。0.33333 != 0.3
所以 1/3 将是 0.3(第三行上方有一行)
1/12 = 0.833333 = 0.083(三号上方有一行)
1/13 = 0.076923076923 = 0.|076923|
这些线代表重复部分。
我计划在课堂上使用这个模型。我对这种情况有点迷茫。我只需要一些想法来确定重复值。谢谢。
循环检测算法就是答案。您可以使用Floyd 的循环检测算法或Brent 的循环检测算法。
插入这些算法的函数是产生商的下一个数字的函数。
在每一步,除法,取数,取余数,乘以十,重复直到得到相同的数字。
例如,对于 1/81:
1/81 = 0 with remainder 1 0
10/81 = 0 with remainder 10 0.0
100/81 = 1 with remainder 19 0.01
190/81 = 2 with remainder 28 0.012
280/81 = 3 with remainder 37 0.0123
...
10/81 = 0 with remainder 10; saw this already.
0.|012345679|
这是一个示例实现:
private static string GetRepeatingPart(int n, int d) {
var seen = new HashSet<int>();
var result = new StringBuilder();
n = (n % d) * 10;
while(true) {
int p = n / d;
n = (n % d) * 10;
if(seen.Contains(n)) {
return result.ToString();
}
result.Append(p);
seen.Add(n);
}
}