在java中找到无理数的大量小数位

时间:2013-03-03 19:26:23

标签: java decimal pi

我想在java中找到22/7到10 ^ 6位小数的值。是否可以在短的编译时间内完成这项工作?

1 个答案:

答案 0 :(得分:1)

拿笔和纸并尝试分割22/7。它看起来像这样

03,142857142857
---
22:7
0
--
22
21
--- < now we calculate fractal part so we will add zeros at the end
 10 # 10 contains 7 only one time -> 1
  7
 ---
  30 # 30 contains 7 four times -> 4
  28 
  ---
   20  ->2
   14
   --- 
    60  ->8
    56
    ---
     40  ->5
     35
     ---
      50  ->7
      49
      ---
       10 # but wee already calculated this state of fractal part
          # so from now on it will repeat again and again and again... 
          # giving ...142857|142857|142857...

所以22/7 = 3,(142857)。知道周期部分从分形部分的第一个位置开始,并且它包含六个数字,我们可以计算10th数字是8(周期部分的第四个数字),20th位置是{{ 1}}(周期性部分的第二个数字)。很容易注意到,如果周期部分从第一个位置开始,那么第n个数字将是(n)mod(周期中的位数),因此4和周期部分中的第四个数字是10 % 6 = 48和周期性部分中的第二个数字是20 % 6 = 2

所以你可能可以实现你自己的缓存算法(比如在一些地图中记住放置的键 - >值对的顺序)并尝试计算分形部分直到

  • 它找到重复部分
  • 在某些时候(如5/4 = 1.250000)分形部分将结束
  • 将计算4数字,而不会找到周期性部分(22/7的第二位数字可以在找到期间之前返回)

其他信息。由于n-thminimal value of X%Y(因此我们将停止分割)且0max value of X%Y,所以期间不能超过您之前划分的数字,因此只有数字在1和Y-1之间可以使用周期性部分,因此其最大长度为Y-1