平方根无理数的精确计算

以前做过一个类似要求计算根号2前100位的题目,不太好想,趁有空的时间在网上查了一下资料,借鉴网友的思路以及代码,自己重新做了一下,并把网友的代码做了一点改进,主要用到了基础数学的多项式的平方展开以及回溯搜索算法,借鉴的链接:http://bbs.csdn.net/topics/370211680?page=2

先贴出网友给的思路:

x^2= A ( A 是常数 )
求x.
大概思想是设 x = ∑(i=0->+∞) a(i) * 10^(-i)
x^2
= ( ∑(i=0->+∞) a(i) * 10^(-i) )^2
= ∑(i=0->+∞) ∑(j=0->i) a(j)a(i-j) * 10^(-i)
一步一步求a(i)
精度也很好控制, 毕竟是10进制展开的.只要0<=a(i+1)<10就行.
试了下可以实现。

网友给的思路还是挺清晰简洁的,我就讲的详细一点,假设x^2=2,就是x等于根号2,那么x肯定是个无理数,小数位数可以延伸到无穷大,如果按照不同位数来把他拆成无穷个多项式的和的话可以表示成x = ∑(i=0->+∞) a(i) * 10^(-i),其中a(i)表示第i位小数的值,然后我们就有了后面的等式:

x^2

= ( ∑(i=0->+∞) a(i) * 10^(-i) )^2

= ∑(i=0->+∞) ∑(j=0->i) a(j)a(i-j) * 10^(-i)

这个式子如果大家没看明白的话可以自己手算一下,总之是要把乘积后的小数位数相同的项放在一起,那么相同小数位数就有不同的组合方式,至于说为什么要拆成这种按小数位来区分的形式,后面我说的会用到。

有了这个式子之后,我们可以申请一个数组代表根号2,第一位放整数位,然后后面放小数,整数位我们是可以直接计算出来然后放进去的,然后我们可以认为这个数组经过计算可以无限接近该无理数,但是永远都比真实数值要小,因为总有更小的位数没有计算出来。

然后我们就可以根据上面的式子进行计算判断了,数组的0号下标已经计算出来了,那么在计算1号下标的时候我们可以从最大的可能数字9开始尝试,假设数组1号下标是9,然后根据上面的公式计算出x^2的第1位小数的值,即∑(j=0->1) a(j)a(1-j) =a(0)a(1)+a(1)a(0),这个时候得到的近似的x^2的值必须要小于x^2的真实值2,有一点是近似的x^2的值是否需要也申请一个数组来表示呢?其实是不必要的,直接一开始的时候用真实值减去每一位的数字就行,用一个变量表示当前的剩余数的大小,只要保证被减完之后一直够减就行。


完整内容见本人个人博客http://blog.summerpro.cn/myblog/?p=171

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值