Golang

package main

import (
"flag"
"fmt"
)

func main() {
var L int
flag.IntVar(&L, "n", 1000, "Number of Pi")
flag.Parse()

N := (L)/4 + 1

s := make([]int, N+3)
w := make([]int, N+3)
v := make([]int, N+3)
q := make([]int, N+3)
n := (int)(float32(L)/1.39793 + 1)

w[0] = 16 * 5
v[0] = 4 * 239

for k := 1; k <= n; k++ {
div(w, 25, w, N)
div(v, 57121, v, N)
sub(w, v, q, N)
div(q, 2*k-1, q, N)
if k%2 != 0 {
add(s, q, s, N)
} else {
sub(s, q, s, N)
}
}
fmt.Printf("%d.", s[0])
for k := 1; k < N; k++ {
fmt.Printf("%04d", s[k])
}
fmt.Println()
return
}

func add(a []int, b []int, c []int, N int) {
i, carry := 0, 0
for i = N + 1; i >= 0; i-- {
c[i] = a[i] + b[i] + carry
if c[i] < 10000 {
carry = 0
} else {
c[i] = c[i] - 10000
carry = 1
}
}
}

func sub(a []int, b []int, c []int, N int) {
i, borrow := 0, 0
for i = N + 1; i >= 0; i-- {
c[i] = a[i] - b[i] - borrow
if c[i] >= 0 {
borrow = 0
} else {
c[i] = c[i] + 10000
borrow = 1
}
}
}

func div(a []int, b int, c []int, N int) {
i, tmp, remain := 0, 0, 0
for i = 0; i <= N+1; i++ {
tmp = a[i] + remain
c[i] = tmp / b
remain = (tmp % b) * 10000
}
}


Java

public class Pi {

public static void main(String[] args) {
int L = 10000;
if (args.length == 1) {
L = Integer.parseInt(args[0]);
}
int N = L / 4 + 1;

int[] s = new int[N + 3];
int[] w = new int[N + 3];
int[] v = new int[N + 3];
int[] q = new int[N + 3];
int n = (int) (L / 1.39793 + 1);
int k;

w[0] = 16 * 5;
v[0] = 4 * 239;

for (k = 1; k <= n; k++) {
div(w, 25, w, N);
div(v, 57121, v, N);
// div ( v, 239, v );
sub(w, v, q, N);
div(q, 2 * k - 1, q, N);

if (k % 2 != 0)
add(s, q, s, N);
else
sub(s, q, s, N);
}

System.out.printf("%d.", s[0]);
for (k = 1; k < N; k++) {
System.out.print(String.format("%04d", s[k]));
// System.out.printf("%d", s[k]);
}
System.out.println();
return;
}

public static void add(int[] a, int[] b, int[] c, int N) {
int i, carry = 0;
for (i = N + 1; i >= 0; i--) {
c[i] = a[i] + b[i] + carry;
if (c[i] < 10000) {
carry = 0;
} else {
c[i] = c[i] - 10000;
carry = 1;
}
}
}

public static void sub(int[] a, int[] b, int[] c, int N) {
int i, borrow = 0;
for (i = N + 1; i >= 0; i--) {
c[i] = a[i] - b[i] - borrow;
if (c[i] >= 0)
borrow = 0;
else {
c[i] = c[i] + 10000;
borrow = 1;
}
}
}

public static void div(int[] a, int b, int[] c, int N) {
int i, tmp, remain = 0;
for (i = 0; i <= N + 1; i++) {
tmp = a[i] + remain;
c[i] = tmp / b;
remain = (tmp % b) * 10000;
}
}

}


C(代码来自互联网)

#include <stdio.h>
#define L 10000 //姹?0000浣峆I鍊?
#define N L/4+1

// L 涓轰綅鏁帮紝N鏄痑rray闀垮害

/*鍦嗗懆鐜囧悗鐨勫皬鏁颁綅鏁版槸鏃犳澧冪殑锛屽浣曚娇鐢ㄧ數鑴戞潵璁$畻杩欐棤姝㈠鐨勫皬鏁版槸涓€浜涙暟瀛﹀涓庣▼寮忚璁″笀鎵€鎰熷叴瓒g殑锛屽湪杩欒竟浠嬬粛涓€涓叕寮忛厤鍚?澶ф暟杩愮畻锛屽彲浠ヨ绠楁寚瀹氫綅鏁扮殑鍦嗗懆鐜囥€?

J.Marchin鐨勫渾鍛ㄧ巼鍏紡锛?
PI = [16/5 - 16 / (3*53) + 16 / (5*55) - 16 / (7*57) + ......] - [4/239 - 4/(3*2393) + 4/(5*2395) - 4/(7*2397) + ......]

*/
void add ( int*, int*, int* );
void sub ( int*, int*, int* );
void div ( int*, int, int* );

int main ( void )
{
int s[N+3] = {0};
int w[N+3] = {0};
int v[N+3] = {0};
int q[N+3] = {0};
int n = ( int ) ( L/1.39793 + 1 );
int k;

w[0] = 16*5;
v[0] = 4*239;

for ( k = 1; k <= n; k++ )
{
// 濂楃敤鍏紡
div ( w, 25, w );
div ( v, 57121, v );
// div ( v, 239, v );
sub ( w, v, q );
div ( q, 2*k-1, q );

if ( k%2 ) // 濂囨暟椤?
add ( s, q, s );
else // 鍋舵暟椤?
sub ( s, q, s );
}

printf ( "%d.", s[0] );
for ( k = 1; k < N; k++ )
printf ( "%04d", s[k] );
printf ( "\n" );
return 0;
}

void add ( int *a, int *b, int *c )
{
int i, carry = 0;

for ( i = N+1; i >= 0; i-- )
{
c[i] = a[i] + b[i] + carry;
if ( c[i] < 10000 )
carry = 0;
else // 杩涗綅
{
c[i] = c[i] - 10000;
carry = 1;
}
}
}

void sub ( int *a, int *b, int *c )
{
int i, borrow = 0;
for ( i = N+1; i >= 0; i-- )
{
c[i] = a[i] - b[i] - borrow;
if ( c[i] >= 0 )
borrow = 0;
else // 鍊熶綅
{
c[i] = c[i] + 10000;
borrow = 1;
}
}
}

void div ( int *a, int b, int *c ) // b 涓洪櫎鏁?
{
int i, tmp, remain = 0;
for ( i = 0; i <= N+1; i++ )
{
tmp = a[i] + remain;
c[i] = tmp / b;
remain = ( tmp % b ) * 10000;
}
}


性能对比(仅供参考,娱乐使用~)

多种语言计算圆周率_i++