給定小數點(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