英國一個大學教授 Robert A.J. Matthews 根據夜空中劃過天際的星星的位置,讓人驚訝的推論出關於 Pi(原週率)的準確度。當然,這牽扯到數論的理論及應用。在此,我們沒有夜空,但是我們要用相同的理論來估計 Pi 的值:

從一個數量龐大的數的集合中隨機的取 2 個數,這 2 個數互質(就是沒有比 1 大的公因數)的機率是:

例如:假設一個數的集合為 {2,3,4,5,6},可以形成 10 對數。其中(2,3), (2,5), (3,4), (3,5), (4,5), (5,6) 這 6 對數互質。所以我們可以推出:

在這個問題中,給你一些數,要請你估計出 Pi 的值。

輸入說明
輸入包含多組測試資料。每組測試資料的第一列有一個正整數 N(1 < N < 50),代表集合中元素的個數。接下來的 N 列每列各有一個正整數,代表此集合中的數。這些數都大於 0,並且小於 32768。

N=0 代表輸入結束。請參考 Sample Input。

輸出說明
對每一組測試資料,輸出你所估計 Pi 的值,四捨五入到小數點後 6 位。如果沒有任何一對數互質,請輸出 No estimate for this data set.

請參考 Sample Output。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from math import sqrt
def check_inverse(a,b):
while a%b!=0:
r=a%b
a=b
b=r

if r==1:
return 1
else:
return 0


while True:
number=int(input())
if number==0:
break
sum_inverse_value=0
total=0
input_list=[]
for i in range(0,number,1):
temp=int(input())
input_list.append(temp)
for i in range(0,number,1):
for j in range(i+1,number,1):
sum_inverse_value=sum_inverse_value+check_inverse(input_list[i],input_list[j])
for i in range(0,number,1):
total=total+i

if sum_inverse_value==0:
print("No estimate for this data set.")
else:
pi=sqrt(6/sum_inverse_value*total)
print(round(pi,6))

c087. 00412 - Pi



作者: 微風