23

私はこの問題について考えてきましたが、理解できません。おそらくあなたは私を助けることができます。問題は、私のコードが Python コーディング言語で 1000 桁の円周率を出力できないことです。

これが私のコードです:

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))今のところ単なるフィラーです。すべてのコードがどのように機能するかは知っていますが、前にも言ったように、そのコードを発射することはできません。

4

11 に答える 11

37

独自のアルゴリズムを実装したくない場合は、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の古いインストールと新しいインストールをサポートします(コメントを参照)。*

于 2012-11-09T22:30:52.997 に答える
23

これを実行

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 

yieldここから演算子 について読んでください: "yield" キーワードは何をしますか?

答えは次のとおりです。

3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337
于 2012-01-25T15:22:38.633 に答える
1

私はあなたのアルゴリズムに精通していません。それはBBPの実装ですか?

いずれにせよ、あなたmake_piは発電機です。for ループで使用してみてください。

for digit in make_pi():
    print digit

このループは無限であることに注意してください make_pi()StopIteration

于 2012-01-25T15:08:49.727 に答える
0

これはあなたが望むことをしますか?

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:])
于 2012-01-25T15:14:29.357 に答える