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

在java中查找无理数的大量小数位数,java,decimal,pi,Java,Decimal,Pi,我想在java中找到22/7到10^6位小数的值。有可能在短编译时间内完成此操作吗?拿一支笔和一张纸,试着除以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

我想在java中找到22/7到10^6位小数的值。有可能在短编译时间内完成此操作吗?

拿一支笔和一张纸,试着除以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...
03142857142857
---
22:7
0
--
22
21
---<现在我们计算分形部分,以便在末尾添加零
10#10只包含7次->1次
7.
---
30#30包含7个四次->4个
28
---
20  ->2
14
--- 
60  ->8
56
---
40  ->5
35
---
50  ->7
49
---
10#但我们已经计算了分形部分的这种状态
#所以从现在起,它会一次又一次地重复。。。
#给予…142857 | 142857 124857 124857。。。
所以
22/7=3,(142857)
。知道周期部分从分形部分的第一个位置开始,它包含六个数字,我们可以计算出
10
位是
8
(周期部分的第四位),
20
位是
4
(周期部分的第二位)。很容易注意到,如果周期部分从第一个位置开始,那么第n个数字将是(n)mod(周期中的位数),因此
10%6=4
,周期部分的第四个数字是
8
20%6=2
,周期部分的第二个数字是
4

所以,您可能可以实现自己的算法,该算法将缓存(例如,在一些能够记住放置的键->值对顺序的映射中),并尝试计算分形部分,直到

  • 它找到重复的部分
  • 在某个时刻(如5/4=1.250000),分形部分将结束
  • 将在不查找周期部分的情况下计算第n个位数(可在查找周期之前返回22/7的第2位数)


其他信息。周期不能长于您用来分割的数字,因为
X%Y的最小值
0
(在这种情况下,我们将停止分割),而
X%Y的最大值
Y-1
,因此,周期部分只能使用1和Y-1之间的数字,因此其最大长度将为
Y-1

请参见问题
22/7
是否合理。计算到一百万个地方并不困难。计算
pi
到一百万个位置会更加困难。短的编译时间是微不足道的。你是说执行时间短吗?
22/7
正好是
3.(142857)
,其中括号表示周期部分。
103993/33102=3.1(4159265301190267226149477729296840070086399613316)
;看见