求pi 以及 pi小数点后n位

这时IOCCC大赛上的得奖代码, 求pi, 可以精确到第56000位. 膜拜大神.

#include <stdio.h>
#define MAX_C 56000
int a=10000,b,c=MAX_C,d,e,f[MAX_C+1],g;
main(){
for(;b-c;) f[b++]=a/5;
for(;d=0,g=c*2;c -=14,printf("%.4d",e+d/a),e=d%a)
for(b=c; d+=f[b]*a,f[b]=d%--g,d/=g--,--b; d*=b);
printf("\n");
getchar();}

我对这个代码做了些修改, 输入一个n, 求出pi小数点后第n位.

// 求小数点后n位 
#include <iostream>
#define MAX_C 56000
int a = 10000, b, c = MAX_C, d, e, f[MAX_C + 1], g, n, ans, cnt;
using namespace std;

int main()
{
    scanf("%d", &n);
    for (; b - c; ) f[b++] = a / 5;
    for (; d = 0, g = c * 2; c -= 14, ans = e + d / a, e = d % a, cnt++) {
        if (cnt * 4 > n) break;
        for (b = c; d += f[b]*a, f[b] = d % --g, d /= g--, --b; d *= b);
    }
    if (n % 4 == 0) cout << (ans / 1000);
    else if (n % 4 == 1) cout << ((ans / 100) % 10);
    else if (n % 4 == 2) cout << ((ans / 10) % 10);
    else if (n % 4 == 3) cout << (ans % 10);
}

原理? 我也不知道呀.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值