多种语言计算圆周率

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;
    }
}




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




猜你喜欢

转载自blog.csdn.net/wang805447391/article/details/78301183