web-dev-qa-db-fra.com

1000 chiffres de pi en python

J'ai réfléchi à ce problème et je n'arrive pas à le comprendre. Peut-être que vous pouvez m'aider. Le problème est que mon code ne fonctionne pas pour générer 1000 chiffres de pi dans le langage de codage Python. 

Voici mon code:

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 

Je sais que ce code peut être corrigé pour fonctionner, mais je ne suis pas sûr de ce qu'il faut corriger ... L'instruction print qui dit ici est une grosse chaîne et la my_array.append(str("hello, im an element in an array \n)) n'est qu'un remplissage pour l'instant. Je sais comment tout le code est utilisé pour fonctionner, mais comme je l'ai déjà dit, je ne parviens pas à le faire sortir.

14
bobimo

Lance ça

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


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 

Et lisez à propos de l'opérateur yield à partir d'ici: Que fait le mot-clé "rendement"?

Voici la réponse:

3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337
18
batbaatar

Si vous ne voulez pas implémenter votre propre algorithme, vous pouvez utiliser 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

Référence

Mise à jour: Code prend en charge les installations anciennes et récentes de SymPy (voir comment ). *

30
Garrett Hyde

Ici, vous pouvez vérifier si votre programme affiche les 1000 chiffres corrects: http://spoj.com/CONSTANT

Bien sûr, vous pouvez aussi utiliser diff ou tc, mais vous devez copier ces 1000 chiffres et vous devez simplement soumettre votre programme et vérifier si le score est supérieur à 999.

Vous pouvez essayer d’imprimer encore plus de chiffres et d’obtenir plus de points. Peut-être que ça vous plairait.

1
user1

formule wallis peut aller à 3.141592661439964 mais un moyen plus efficace est nécessaire pour résoudre ce problème. 

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

et maintenant mon code

x, y, summing = 2, 3, 4

for count in range (0,100000000):
    summing *= (x/y)
    x += 2
    summing *= (x/y)
    y += 2
    print (summing)
0
tanny

Voici une manière différente que j'ai trouvée ici -> Calcul de pi en python? approcher python sur la base de la formule de génération de Pi des frères Chudnovsky que j'ai modifiée visiblement pour mon programme.

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))

J'espère que cela vous aidera car vous pouvez générer autant de chiffres de pi que vous souhaitez générer.

0
Timothy

Je ne connais pas votre algorithme. Est-ce une implémentation de BBP?

Dans tous les cas, votre make_pi est un générateur. Essayez de l'utiliser dans une boucle for:

for digit in make_pi():
    print digit

Notez que cette boucle est infinie: make_pi() ne jette jamais StopIteration

0
Managu

Est-ce que ça fait ce que tu veux?

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:])
0
Scott Hunter