https://rosettacode.org/wiki/Pi
Basic
代码: 全选
10 PRINT CHR$(147)
20 n = 100
30 ln = int(10*n/4)
40 nd = 1
50 dim a(ln)
60 n9 = 0
70 pd = 0 :rem First predigit is a 0
80 :
90 for j = 1 to ln
100 a(j-1) = 2 :rem Start with 2s
110 next j
120 :
130 for j = 1 to n
140 q = 0
150 for i = ln to 1 step -1 :rem Work backwards
160 x = 10*a(i-1) + q*i
170 a(i-1) = x - (2*i-1)*int(x/(2*i-1)) :rem X - INT ( X / Y) * Y
180 q = int(x/(2*i - 1))
190 next i
200 a(0) = q-10*int(q/10)
210 q = int(q/10)
220 if q=9 then n9 = n9 + 1 : goto 450
240 if q<>10 then 350
250 rem q == 10
260 d = pd+1 : gosub 500
270 if n9 < 0 then 320
280 for k = 1 to n9
290 d = 0: gosub 500
300 next k
310 rem end if
320 pd = 0
330 n9 = 0
335 goto 450
340 rem q <> 10
350 d = pd: gosub 500
360 pd = q
370 if n9 = 0 then 450
380 for k = 1 to n9
390 d = 9 : gosub 500
400 next k
410 n9 = 0
450 next j
460 print mid$(str$(pd),2,1)
470 end
480 :
490 rem outputd
500 if nd=0 then print mid$(str$(d),2,1); : return
510 if d=0 then return
520 print mid$(str$(d),2,1);".";
530 nd = 0
550 return
代码: 全选
Program Pi_Spigot;
const
n = 1000;
len = 10*n div 3;
var
j, k, q, nines, predigit: integer;
a: array[0..len] of longint;
function OneLoop(i:integer):integer;
var
x: integer;
begin
{Only calculate as far as needed }
{+16 for security digits ~5 decimals}
i := i*10 div 3+16;
IF i > len then
i := len;
result := 0;
repeat {Work backwards}
x := 10*a[i] + result*i;
result := x div (2*i - 1);
a[i] := x - result*(2*i - 1);//x mod (2*i - 1)
dec(i);
until i<= 0 ;
end;
begin
for j := 1 to len do
a[j] := 2; {Start with 2s}
nines := 0;
predigit := 0; {First predigit is a 0}
for j := 1 to n do
begin
q := OneLoop(n-j);
a[1] := q mod 10;
q := q div 10;
if q = 9 then
nines := nines + 1
else
if q = 10 then
begin
write(predigit+1);
for k := 1 to nines do
write(0); {zeros}
predigit := 0;
nines := 0
end
else
begin
write(predigit);
predigit := q;
if nines <> 0 then
begin
for k := 1 to nines do
write(9);
nines := 0
end
end
end;
writeln(predigit);
end.
代码: 全选
def calcPi():
q, r, t, k, n, l = 1, 0, 1, 1, 3, 3
while True:
if 4*q+r-t < n*t:
yield n
nr = 10*(r-n*t)
n = ((10*(3*q+r))//t)-10*n
q *= 10
r = nr
else:
nr = (2*q+r)*l
nn = (q*(7*k)+2+(r*l))//(t*l)
q *= k
t *= l
l += 2
k += 1
n = nn
r = nr
import sys
pi_digits = calcPi()
i = 0
for d in pi_digits:
sys.stdout.write(str(d))
i += 1
if i == 40: print(""); i = 0