以下是求π的高精度算法程序,可以在普通PC上跑出100多万位,毫无压力,有兴趣的朋友可以试试。

#include"cstdio";
using namespace std;

void pi(long length) {
	unsigned long n = 0;       //循环次数
	int flag = 1;             //循环结束标志
	long numerator = 2;        //分子
	long denominator = 5;      //分母
	char pi[length] = {0};    //字节类型数组
	char temp[length] = {0};  //
	int result = 0;           //未进位前的数字
	int carry = 0;            //进位数
	long sum = 0;             //求和汇总

	//赋初始值
	pi[0] = 2;
	temp[0] = 0;
	for (long i = 1; i < length; i++) {
		pi[i] = 6;
		temp[i] = 6;
	}

	//开始运算
	while (flag && (n < 320000)) {
		//    Serial.print("第");
		printf("%d\n",n);
		//    Serial.println("轮");

		//从低位到高位依次乘法和进位运算
		carry = 0;
		for (long i = length - 1; i >= 0; i--) {
			result = temp[i] * numerator + carry;
			temp[i] = result % 10;
			carry = result / 10;
		}

		//从高位到低位依次进行除法运算
		carry = 0;
		for (long i = 0; i < length; i++) {
			result = temp[i] + carry * 10;
			temp[i] = result / denominator;
			carry = result % denominator;
		}

		//从低位到高位依次把temp[]的数据累加到pi[]中
		for (long i = length - 1; i >= 0; i--) {
			result = temp[i] + pi[i];
			pi[i] = result % 10;
			pi[i - 1] += (result / 10);
		}

		//判断temp[]的后20个数是否为0,如果为都为0则退出循环,这样设计可以提高运算速度
		flag = 0;
		sum = 0;
		for (long i = length-1; i >= length-20; i--) {
			sum += temp[i];
		}
		if (sum == 0) {
			flag = 0;
		} else {
			flag = 1;
		}

		//更新循环数字
		n++;
		numerator++;
		denominator += 2;
	}

	//输出计算结果

	for (long i = 0; i < length; i++) {
		printf("%d",(int)pi[i]);
		if (i == 0)printf(".");
	}

}


int main() {
	pi(10000);  //调用函数,参数为pi的位数
}
Logo

集算法之大成!助力oier实现梦想!

更多推荐