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