麦金公式
#include<stdio.h>
#include<math.h>
int main()
{
double s;
int b,x,n,c,i,j,d,l,a[1500];
while(scanf("%d",&n)!=EOF&&n!=0)
{
x=5*n;
for(s=0,n=1; n<=5000; n++)
{
s=s+(double)log((double)(2*n+1)/n);
if((int)s/log(10.0)>x+1)
break;
}
for(i=0; i<=x+5; i++)
a[i]=0;
for(c=1,j=n; j>=1; j--)
{
d=2*j+1;
for(i=0; i<=x+4; i++)
{
a[i]=c/d;
c=(c%d)*10+a[i+1];
}
a[x+5]=c/d;
for(b=0,i=x+5; i>=0; i--)
{
a[i]=a[i]*j+b;
b=a[i]/10;
a[i]=a[i];
}
a[0]=a[0]+1;
c=a[0];
}
for(b=0,i=x+5; i>=0; i--)
{
a[i]=a[i]*2+b;
b=a[i]/10;
a[i]=a[i];
}
printf("%d.\n",a[0]);
for(l=0,i=1; i<=x; i++)
{
if(l==0)
printf(" ");
printf("%d",a[i]);
l++;
if(l%5==0&&lP!=0)
printf(" ");
if(lP==0)
{
printf("\n");
if(i!=x)
printf(" ");
}
}
if(xP!=0)
printf("\n");
}
return 0;
}
//网上精确到一万位代码
#include<stdio.h>
int main()
{
int n;
while(scanf("%d",&n)!=EOF&&n!=0)
{
int const N=7200;
int const M=10000;
int const B=10000;
int const L=4;
Machin公式 计算pi到一万位
int s[M/L];
int r1[N]= {0},r2[N]= {0},d1[N]= {0},d2;
int r3[N]= {0},r4[N]= {0},d3[N]= {0},d4;
int i,k,t,p=0,mp=M/L/20;
r1[0]=1;
r1[1]=3;
r3[0]=4;
printf("正在计算,请等待\n____________________\n");
for(k=0; k<M/L; ++k)
{
t=r1[0]*B;
d1[0]=t/0x5;
r1[0]=t%0x5;
//
t=r3[0]*B;
d3[0]=t/0xEF;
r3[0]=t%0xEF;
s[k]=d1[0]-d3[0];
int tag=0;
for(i=1; i<N; ++i)
{
t=r1[i]*B+d1[i-1];
d1[i]=t/0x19;
r1[i]=t%0x19;
t=r2[i]*B+d1[i];
d2=t/(2*i+1);
r2[i]=t%(2*i+1);
//
t=r3[i]*B+d3[i-1];
d3[i]=t/0xDF21;
r3[i]=t%0xDF21;
t=r4[i]*B+d3[i];
d4=t/(2*i+1);
r4[i]=t%(2*i+1);
if(tag)
{
s[k]+=(d2-d4);
tag=0;
}
else
{
s[k]+=(d4-d2);
tag=1;
}
}
if(p==mp)
{
printf(">");
p=0;
}
else
p++;
}
for(i=M/L-1; i>=0; i--)
{
while(s[i]>=B)
{
s[i-1]++;
s[i]-=B;
}
while(s[i]<0)
{
s[i-1]--;
s[i]+=B;
}
}
printf("\npi=3.\n");
for(i=0; i<M/L; ++i)
printf("d",s[i]);
}
return 0;
}
迭代公式:PI=2+(1/3×(2+2/5×(2+...)))
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
BigDecimal TWO=BigDecimal.valueOf(2);
BigDecimal ans=BigDecimal.valueOf(2);
for(int i=5000; i>=1; i--)
{
ans=TWO.add(ans.multiply(td(i)).divide(td(2*i+1),1800,BigDecimal.ROUND_HALF_UP));
}
String stra=ans.toString();
Scanner sc=new Scanner(System.in);
while(sc.hasNext())
{
int n=sc.nextInt();
if(n==0)break;
System.out.println("3.");
for(int i=0; i<n; i++)
{
System.out.print(" ");
System.out.print(stra.substring(i*5+2,i*5+7));
if((i+1)%10==0)System.out.println();
}
if(n%10!=0)System.out.println();
}
}
public static BigDecimal td(int n)
{
return BigDecimal.valueOf(n);
}
}