给定小数点(103993/33102),我需要在该小数点的小数点后找到50000个数字。以精确的方式计算十进制小数并显示小数点后的数字
最初我在C++中使用了setprecision(k)
,但它在小数点后只有17位数。我也试过
sprintf (str, "%.500000f", num)
但结果是一样的。
我需要一个算法,可以解决这个问题,它不会在小数点后的数字四舍五入,即它应该是精确的。
给定小数点(103993/33102),我需要在该小数点的小数点后找到50000个数字。以精确的方式计算十进制小数并显示小数点后的数字
最初我在C++中使用了setprecision(k)
,但它在小数点后只有17位数。我也试过
sprintf (str, "%.500000f", num)
但结果是一样的。
我需要一个算法,可以解决这个问题,它不会在小数点后的数字四舍五入,即它应该是精确的。
解决如何解决这个问题的最好方法是采取一个可笑的简单问题,并找出算法。这样,您不会感到困惑或失去自己的位置,而且无论问题如何,算法都是一样的。那我们来看看4/3
。
4进入3次一次。我们剩下1个。我们输出1.
一次它进去。我们保留1剩下。
我们将剩余的1乘以10得到10. 3(我们的分母)进入10三次。剩下1个。我们输出3
,因为它进行了三次。我们还剩下1个。
我们进入步骤2并重复我们需要的次数。
只要它们是正整数,这个算法就可以简单地工作而不管分子和分母。
float或double将不会这样做,因为它们不够精确。其他人建议使用一个bignum库。这可以完成,但有另一种方式直接与整数。
一种叫做模幂的技术可以用来解决这个问题。这使您可以计算所有数字,而不会遇到精度问题。
幸运的答案如何做到这一点已经写入:
Getting a specific digit from a ratio expansion in any base (nth digit of x/y)
你是认真问我们怎么办长除法?请告诉我,你不是一个不知道如何做长分的程序员。这是在四年级和五年级教!试试这个[数学很有趣](http://www.mathsisfun.com/long_division3.html)页面。我知道人们争论成为一名程序员需要多少高等数学,但需要知道如何做基本的算术应该是没有争议的! – 2013-03-05 05:07:47
...我不知所措。 – 2013-03-05 05:08:48
@DavidSchwartz:长分为50000位很难,我怀疑大多数编码人员可以在没有图书馆的情况下做到这一点。 (显而易见的答案是使用库) – 2013-03-05 05:18:10