有许多方法可以将有理数转换为带有重复部分的小数(换句话说,10/3=3.(3)
,其中(3)
表示它永远重复)。但这些只有在分子和分母是整数的情况下才有效。如果分子或分母是双重的,我们能做什么?例如,我们如何才能找到
1/0.3 = 3.(3)
更新: 这只适用于int数字。
http://www.programcreek.com/2014/03/leetcode-fraction-to-recurring-decimal-java/
答案 0 :(得分:0)
让我们将问题分成两部分:
1/0.3
转换为N/M
表格N/M
转换为a.b(c)
表格 允许将0.3
格式转换为M/N
格式(这会给我们3/10
)。
String input = "123.456";
String[] parts = input.split("\\.");
String whole = parts[0];
String fraction = parts[1];
int wholeInt = Integer.parseInt(whole);
int fractionInt = Integer.parseInt(fraction);
int multiplier = pow10(fraction.length());
int n = wholeInt * multiplier + fractionInt;
int m = multiplier;
System.out.println(n + "/" + m);
我使用了函数pow10
,它只返回10个电源输入。
现在我们需要将1
除以10/3
这很容易N1/M1
除以N2/M2
它只是(N1*M2)/(N2*M1)
。< / p>
我们现在以N/M
格式得到我们的结果(我们还需要通过将这两个部分除以GCD(N, M
来对其进行标准化)
现在我们已经准备好解决主要问题了。
首先得到整个部分
int whole = n/m;
然后找到分数和重复部分
int current = n%m;
StringBuilder sb = new StringBuilder();
List<Integer> controlSet = new ArrayList<>();
while((!controlSet.contains(current))){
int currentDigit = current *10 / m;
sb.append(currentDigit);
controlSet.add(current);
current = current *10 - m * currentDigit;
}
String fraction = sb.toString().substring(0, controlSet.indexOf(current));
String repeat = sb.toString().substring(controlSet.indexOf(current));
这里我们只是按循环划分结果编号。
当我们遇到我们已经使用的current
时,主要技巧然后编号开始重复。
现在你需要把所有部分放在一起。实施GCD
(许多通过互联网实施)。