1000 цифр числа pi в python

Я думал об этой проблеме, и я не могу понять это. Возможно, вы сможете мне помочь. Проблема в том, что мой код не работает для вывода 1000 цифр pi на языке кодирования python.

вот мой код:

def make_pi():
    q, r, t, k, m, x = 1, 0, 1, 1, 3, 3
    while True:
        if 4 * q + r - t < m * t:
            yield m
            q, r, t, k, m, x = (10*q, 10*(r-m*t), t, k, (10*(3*q+r))//t - 10*m, x)
        else:
            q, r, t, k, m, x = (q*k, (2*q+r)*x, t*x, k+1, (q*(7*k+2)+r*x)//(t*x), x+2)

digits = make_pi()
pi_list = []
my_array = []
for i in range(1000):
    my_array.append(str("hello, I'm an element in an array n" ))
big_string = "".join(my_array)

print "here is a big string:n %s" % big_string 

Я знаю, что этот код можно исправить, но я не уверен, что исправить...Оператор print говорит, что здесь большая строка и my_array.append(str("hello, im an element in an array n)) пока только наполнитель. Я знаю, как работает весь код, но, как я уже сказал, Я не могу получить это, чтобы стрелять из этого кода.

7 ответов


запустить

def make_pi():
    q, r, t, k, m, x = 1, 0, 1, 1, 3, 3
    for j in range(1000):
        if 4 * q + r - t < m * t:
            yield m
            q, r, t, k, m, x = 10*q, 10*(r-m*t), t, k, (10*(3*q+r))//t - 10*m, x
        else:
            q, r, t, k, m, x = q*k, (2*q+r)*x, t*x, k+1, (q*(7*k+2)+r*x)//(t*x), x+2


digits = make_pi()
pi_list = []
my_array = []

for i in make_pi():
    my_array.append(str(i))

my_array = my_array[:1] + ['.'] + my_array[1:]
big_string = "".join(my_array)
print "here is a big string:\n %s" % big_string 

и почитай про yield оператор отсюда: что делает ключевое слово "yield" в Python?

вот ответ:

3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337

Если вы не хотите реализовать свой собственный алгоритм, вы можете использовать mpmath.

try:
    # import version included with old SymPy
    from sympy.mpmath import mp
except ImportError:
    # import newer version
    from mpmath import mp
mp.dps = 1000  # set number of digits
print(mp.pi)   # print pi to a thousand places

ссылка

обновление: код поддерживает старые и новые установки SymPy (см. комментарий).*


здесь вы можете проверить, выводит ли ваша программа правильные 1000 цифр: http://spoj.com/CONSTANT

конечно, вы можете использовать diff или tc, но вам придется скопировать эти 1000 цифр откуда-то, и там вы просто отправьте свою программу и проверьте, больше ли оценка, чем 999.

можно попробовать напечатать еще больше цифр и таким образом получить больше очков. Возможно, Вам понравится.


Я не знаком с вашим алгоритмом. Является ли это реализацией BBP?

в любом случае, ваш make_pi генератор. Попробуйте использовать его в цикле for:

for digit in make_pi():
    print digit

обратите внимание, что этот цикл бесконечен: make_pi() никогда не бросает StopIteration


это делает то, что вы хотите?

i = 0;
pi_str = ""
for x in make_pi():
    pi_str += str(x)
    i += 1
    if i == 1001:
        break

print "pi= %s.%s" % (pi_str[0],pi_str[1:])

формула Уоллиса может добраться до 3.141592661439964, но для решения этой проблемы необходим более эффективный способ.

https://www.youtube.com/watch?v=EZSiQv_G9HM

and now my code
x = 2
y = 3
summing = 4
for count in range (0,100000000):
    summing *= (x/y)
    x += 2
    summing *= (x/y)
    y += 2
print (summing)

вот другой способ, который я нашел здесь --> расчет Python pi? аппроксимировать python на основе формулы братьев Чудновских для генерации Pi, которую я sightly изменил для своей программы.

def pifunction():
    numberofdigits = int(input("please enter the number of digits of pi that you want to generate"))
    getcontext().prec = numberofdigits

def calc(n):
    t = Decimal(0)
    pi = Decimal(0)
    deno = Decimal(0)
    k = 0
    for k in range(n):
        t = (Decimal(-1)**k)*(math.factorial(Decimal(6)*k))*(13591409+545140134*k)
        deno = math.factorial(3*k)*(math.factorial(k)**Decimal(3))*(640320**(3*k))
        pi += Decimal(t)/Decimal(deno)
    pi = pi * Decimal(12)/Decimal(640320**Decimal(1.5))
    pi = 1/pi
    return str(pi)
print(calc(1))

Я надеюсь, что это поможет, так как вы можете генерировать любое количество цифр pi, которые вы хотите генерировать.