圆周率高精度算法

 

#include
#define MAX 1000000    //f数组要足够大,否则计算较多位数时可能会发生数组越界
#define WEI 100    // 小数点后位数(必须是4的倍数)
int a,b,c,d,e,f[MAX],g;
int main() {
	a=10000;
	b=c=WEI/4*14;
	d=e=0;
	g=c*2;
	for(int i = 0;i < c;i++) f[i]=2000;    // 初始化f数组
	while (c) {
		b = c;
		while(1) {
			d += f[b] * a;
			g--;
			f[b] = d % g;
			d /= g;
			g--;
			b--;
			if(!b) break;
			d *= b;
		}
		c -= 14;
		printf("%.4d",e + d / a);    //一次输出4位数
		e = d % a;
		d = 0;
		g = c * 2;
	}
	return 0;
}

        代码是我根据网上流传的"三行代码求圆周率"改编来的,具体原理我也不明白,只知道是通过无穷项迭代来的,在许多学习群里问了许多大佬,然而始终不能得到满意的回答,改编之后比原来稍微好懂了一些,最起码清楚了其中某些的功能,使得可以通过修改求出更多位了,算法复杂度为O(n2),计算万位内比较好,之后便效率低下,下图为我最开始百度到的原代码:

圆周率高精度算法_第1张图片

.。。。是不是完全没法入眼?所以我们还是看上面的虽然长一些但是逻辑和条理清晰一些的代码吧。。。

 

你可能感兴趣的:(算法)