-1

我想在 java 中找到 22/7 到 10^6 位小数的值。是否有可能在很短的编译时间内做到这一点?

4

1 回答 1

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位置是4(周期部分的第二位)。很容易注意到,如果周期部分从第一个位置开始,那么第 n 位将是 (n)mod(周期中的位数),所以10 % 6 = 4周期部分的第四位是8,周期部分的20 % 6 = 2第二位是4

因此,您可能可以实现自己的算法来缓存(假设在一些记住放置键->值对的顺序的地图中)并尝试计算分形部分,直到

  • 它找到重复的部分
  • 在某个点(如 5/4 = 1.250000)分形部分将结束
  • 将在不找到周期部分的情况下计算n-th数字(可以在找到周期之前返回 22/7 的第二个数字)

附加信息。Period 不能长于您用来划分的数字,因为minimal value of X%Yis 0(在这种情况下,我们将停止划分)并且max value of X%Yis Y-1,因此只能在周期性部分使用 1 和 Y-1 之间的数字,因此其最大长度将为Y-1

于 2013-03-03T21:08:52.153 回答