给定分数(103993/33102),我需要找到此分数小数点后的50000位数。
最初我在C ++中使用了setprecision(k)
,但它在小数点后只给出了17位数。我也试过
sprintf (str, "%.500000f", num)
但结果是一样的。
我需要一种能够解决这个问题的算法,它不会使小数点后的数字四舍五入,即它应该是精确的。
答案 0 :(得分:3)
解决如何解决这样的问题的最好方法是采取一个非常简单的问题,然后计算出算法。这样,你不会感到困惑或失去你的位置,无论问题如何,算法都是一样的。我们来看4/3
。
4进入3次。我们剩下1个。我们输入了1.
一次。我们保留了1。
我们将剩下的1乘以10得到10. 3(我们的分母)进入10次三次。剩下1个。
我们输出3
因为它进入了三次。我们还剩下1个。
我们转到第2步,并根据需要重复多次。
只要它们是正整数,这个算法就可以正常工作,无论分子和分母如何。
答案 1 :(得分:1)
Float或double不会这样做,因为它们不够精确。其他人建议使用bignum图书馆。这可以做到,但还有另一种方法可以直接使用整数。
可以使用称为模幂运算的技术来解决此问题。这使您可以计算所有数字而不会遇到精度问题。
幸运的是,已经写了一个如何做到这一点的答案:
Getting a specific digit from a ratio expansion in any base (nth digit of x/y)