说起圆周率的算法很多人都会想起一大堆的无穷级数等各种表达式,但是这样的算法需要比较高的数学推理水品,而且对于很多初学者而言很难理解。程序员不能仅仅是机械的写程序,必须要真正的理解程序中每个代码的意义,这样才能像写文章一样写出好程序来,下面介绍一种运算量很大但是却非常简单的圆周率算法。
先问一个问题,圆周率是什么?
可能有人会说是圆周长和直径的比,或者有人说圆面积和半径平方的比。我的一个老师曾经说不要为了复杂而复杂,抓住问题的本质往往是最有效的手段,从圆周率的本质而言,它不是什么无穷级数的收敛值或者某个函数的极限值,它只是我们一个简单的面积比或者长度比。
此外就是,无论怎么计算,圆周率是算不完的,所以必须有无限高的精度才能把圆周率准确的算出来,这样虽然很麻烦却给了我们一个很大的舞台,只要我们这个算法在无限次运算后理论上能得到圆周率精确值就说明算法还是可行的(虽然要考虑效率的问题)
下面说我的算法,以半径1画个圆,然后用一定的步长把圆的外接正方形内部分用点阵的方法扫描出来,这样就可以很轻松的计算每个点是不是在圆内,圆内点的数目和总数目的比就是圆周率的1/4
程序实现起来很简单,下面是matlab的代码(C语言orC++的自己写吧,很简单的)
x=-1:.00003:1; y=x; number=0; number_all=length(x)*length(y); for i=1:length(x) for j=1:length(y) if x(i)*x(i)+y(j)*y(j)<1 number=number+1; end end end pai=4*(number/number_all)
用这个matlab代码的方法算出来的圆周率是3.141560962与3.141592654的公认值还是有比较大的差距的,但是只要提高X的扫描范围就能极大地提高精度,可惜本人的电脑不行,就只能算到这个地步了。