通过程序代码实现圆周率的计算-实现超长小数位计算

圆周率有很多计算的方法,但是在计算机程序中如何实现圆周率的计算呢,通常我们可以通过代码实现计算圆周率的公式来得到比较精确的圆周率,如下代码我们实现了计算圆周率的莱布尼茨公式(π/4=1-1/3+1/5-1/7+1/9-1/11+……),由于圆周率π的小数位是无限的,普通的数据类型是无法得到任意位精度的计算,我们通过模拟加减乘除的竖式计算,使用数组来存储圆周率π的每一位数,从而实现了超长小数位精度的计算,对于越高精度的计算,所花费的时间越长,需要计算机的性能越高:

1、实现分数计算函数,得到超长小数位精度的结果

void jsxs(int fz, int fm, int* ret)
{
	int pos = 0;
	ret[pos++] = fz/fm;
	
	int r=fz%fm;
	int i = 1;
	while(i<20){

		ret[pos++] = (r*10)/fm;
		r=(r*10)%fm;
		i++;
	}
}

2、实现超长小数位精度的竖式加法函数

void add(int* shu1, int* shu2) {
	int jw = 0;
	int tmp;
	for(int i=19;i>=0;i--){
		tmp = shu1[i] + shu2[i] + jw;
		shu1[i] = tmp%10;
		jw = tmp/10;	
	}
}

3、实现超长小数位精度的竖式减法函数

void sub(int* shu1, int* shu2) {
	int jw = 0;
	int tmp;
	for(int i=19;i>=0;i--){
		tmp = shu1[i] - jw;
		if (tmp < shu2[i]) {
			tmp += 10;
			jw=1;
		} else {
			jw=0;
		}
		shu1[i] = tmp - shu2[i];	
	}
}

4、实现超长小数位精度的竖式乘法函数

void mult(int* shu1, int shu2) {
	int jw = 0;
	int tmp;
	for(int i=19;i>=0;i--){
		tmp = shu1[i] * shu2 + jw;
		shu1[i] = tmp%10;
		jw = tmp/10;	
	}
}

5、实现打印超长小数的函数

void printData(int* ret) {
	for(int i=0;i<20;i++){
		cout<<ret[i];
		if (i == 0) {
			cout<<".";
		}
	}
	cout<<endl;
}

6、实现数组初始化函数

void clear(int* shu) {
	for(int i=0;i<20;i++){
		shu[1] = 0;
	}
}

7、实现莱布尼茨公式(π/4=1-1/3+1/5-1/7+1/9-1/11+……)函数,计算圆周率

void pai(int* ret) {
	long long a,q=0,s=1;

	int xiaoshu[20] = {};
	
	cin>>a;
	for(int i=1;i<=a;i++){
		q++;
		s+=2;

		jsxs(1, s, xiaoshu);

		if(q%2!=0){
			sub(ret, xiaoshu);	
		}else{
		    add(ret, xiaoshu);
		}
		
	}
	
	mult(ret, 4);
}

8、主函数main

int main()
{
	for(int i=0;i<=1000;i++){
		int ret[20] = {1};
		
		pai(ret);
		printData(ret);
	}
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jackiendsc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值