說的可能比較啰嗦。
在洛谷P2181 對角線 問題中,按照高中所學的組合數可推答案為Cn4(該題題解中有詳細過程,這里不多贅述),問題在本文中並不重要。
但題中有一個有意思的點,就是題目的答案是非常大的,用long long都不行,c++中需要用unsigned long long,自然,我就想到python中的int類型范圍與內存掛鈎,(一般可理解能取到該系統的最大值)
代碼如下
m = int(input())
n = int(m*(m-1)/2*(m-2)/3*(m-3)/4)
# 首先大家可以注意一個點,我在這里注意到了要把結果轉換為int類型
print(n)
那么大家可以運行一下這個程序,其實如果精度較低的情況下,答案是沒有問題的,但是此題正好碰到了它的最高精度,會發現結果相差不多,導致我沒有全ac,於是我開始探尋原因 其實我最開始沒有主要float類型,直到一個dl告訴我把他改為這樣就好
代碼如下
m = int(input())
n = m*(m-1)//2*(m-2)//3*(m-3)//4
print(n)
此時,我才想起來python內部將“/”默認為float除法,根據計算機給予的float類型的精度本身就是小於c++中的unsigned long long類型 查閱為2的53次方,自然不滿足題意,float就會取一個近似值(這不糊弄人嗎?[doge])
上邊代碼應該時最簡單的改法了,但是其實還有一種改法 就是提高精度(利用python中的decimal模塊)即可。
代碼如下
import decimal
m = decimal.Decimal(int(input()))
n = int(m*(m-1)/2*(m-2)/3*(m-3)/4)
print(n)