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.
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
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
Mise à jour: Code prend en charge les installations anciennes et récentes de SymPy (voir comment ). *
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.
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)
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.
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
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:])