这是我遇到的一个访谈问题:查找K
的小数表示的1/N
个第一位数字。看起来我们只需要计算10^K/N
来解决问题。是否有意义 ?看起来我错过了一些东西,因为解决方案太容易了。
答案 0 :(得分:6)
实施小学 - 学校长师:
int value = 1;
bool outputDecimalSeparator = false;
int digitsOutput = 1;
while(digitsOutput <= k) {
if (value == 0) {
Console.Write(0);
}
else {
if (value < n) {
Console.Write(0);
value *= 10;
}
else {
Console.Write(value / n);
value %= n;
}
}
if (outputDecimalSeparator == false) {
outputDecimalSeparator = true;
Console.Write('.');
}
digitsOutput++;
}
Console.WriteLine();
value == 0
上的分支是检测1 / n
何时有一个小于k
位的终止表示。
此处,n
是1 / n
中的分母,k
是以1 / n
的十进制表示形式打印的位数。
请注意,通过将value *= 10
更改为value *= b
,您也可以打印1 / n
的b-ary表示。
答案 1 :(得分:4)
对于大K和小N,计算10 ^ K / N可能是非常昂贵的。
这可能更接近于一个好的解决方案:long division。这是我们在计算器之前用来划分数字的方式。 :)
显然,你应该只执行这个算法,直到它产生K个数字。
答案 2 :(得分:1)
如果它是前k个数字,是不是很容易将分子乘以10 ^ k,因此更容易除以N?如果我们需要答案,即十进制表示,那么我们将再次将结果除以10 ^ K,以便先前的乘法无效。