zoukankan      html  css  js  c++  java
  • 第99位数字

      (1+√2)500  第99位数字是多少?100位呢?...(更多位的具体数字的计算方法有待探讨)

      这个问题出自Emissary[3],1999 fall 卷。乍一看这个问题似乎有点难。及时你想偷懒决定利用计算机来算,也需要一定的耐心,且需要涉及特殊的程序(结合高效的算法),才能得到你需要的信息。

      如果用计算机的话,因为√2不是常数,需要至少计算101位,而这已经超过了int类型4个字节的存储极限(2^32-1=42 9496 7295),即使使用_int64也无济于事。只能模拟运算了,而这个问题的难点在于模拟 幂运算 或者 两个大整数的乘法运算。有时间,不妨一试。

      读了下面的方法,你会发现:数学是多么的事半功倍!

      注意到下面的表达式

          (1+√2)500 + (1-√2)500

      是一个整数。因为当展开时,所有的√2 的奇次幂都消去了。后半部分是一个非常小的数,有多小?事实上,由于√2-1<1/2 ,(1/2)^500=2^(-500),利用计算机领域常用的近似 2^10≈10^3 , 2^500≈10^150.

      以上,我们有 (1-√2)500 < 10-150 .

      不难想象, (1+√2)500 与上述表达式相差一个几乎可以忽略不计的量,它的十进制表示的小数点后面将有 一大串 的9 。实际上, (1-√2)500约等于 4×10-192  

    因此,小数点后面事实上有191个9,后面跟着590 591 051...特别地,第99位是9.

      是不是感到不可思议呢?同理可知  (1+√2)502 也非常接近一个正整数,但是这两个大数之间的比例是 (1+√2)2 ,用十进制表示是:5.828 427 12...

      添加(1-√2)500  的技巧看起来有些出乎意料,但是这些成对的共轭数的幂(其中一个很大一个很小)在数学中经常出现。Binet 著名的Fibbonacci 公式

               Fn =(1/√5)( (1+√5)/2 )n - (1/√5)( (1-√5)/2)n

      精确的给出了Fibbonacci数列1,1,2,3,5,8,13,21,34,55...的通项公式,但是公式中的第二项已经足够小,以致于使得对任意的n>=0,只需计算 (1/√5)( (1+√5)/2 )n 并找到距离它最近的正整数,即可求出Fn.

                                      2012-04-29 12:10:00    华电一校学一424         

  • 相关阅读:
    nio/mina(三) mina传对象
    Android系统中长按事件的实现机制解析
    android游戏寻路算法
    Xcode 常用快捷键及代码自动排版
    java 日期加天数得到新的日期
    cygwin 中文乱码问题
    Android 中自定义手势
    mina服务端与c++客户端通信1
    java NIO 和阻塞I/O的区别
    Android读写文件
  • 原文地址:https://www.cnblogs.com/tupx/p/2476090.html
Copyright © 2011-2022 走看看