[英]How to calculate large numbers in C++?
我對編程很陌生,遇到一個“簡單”問題來計算算術級數的總和:
我知道公式就像: (2*a + (n-1)*d) * n/2
a
, d
, n
是int
。 n
可以是10000左右,而a
和d
可以是100000。
我知道只要寫一下:
int result = (2*a + (n-1)*d) * n/2;
不管用
*編輯:所以當我寫類似的東西時它可以工作:
long long result = (2*a+(long long)(n-1)*d)*n/2;
但是只是為了闡明以下推理是否正確:
由於使用(long long)
包裝器, (n-1)*d
更改為long long
類型。
那么(2*a+(long long)(n-1)*d)
在加法后也會變long long
嗎? 那么以下操作呢?
非常感謝您的閱讀。
C ++中的整數類型具有固定的位數。 確切的數字因計算機而異,但int
始終至少為 16位, long
至少為32位, long long
至少為64位。 如果將它們混合使用,則結果類型是最長的類型。 但是,除非您使用相應的unsigned
類型,否則您將對符號失去一點了解。
因此,在您的示例中,數字的范圍是10 ^ 4 * 10 ^ 5 * 10 ^ 5,所以10 ^ 14。 該值在long long
(〜10 ^ 19)范圍內,但不在int
的最小范圍內。 現在int
通常大於最小16位,但通常通常僅為32位。 這就解釋了為什么它對您不起作用。
在此表達式中:
long long result = (2*a+(long long)(n-1)*d)*n/2;
的鑄造(long long)(n-1)
的值轉換n-1
到long long
(因此為64比特的最小值)。 這意味着與此相關的任何數學運算也都需要轉換為long long
,因此d
為long long
,而n/2
為long long。 2*a
也需要轉換為long long
。 換句話說,表達式中的所有內容都是以64位數字計算的(或者在某些計算機中可能更大),這不是我見過的更大的long long
。
64位整數將很容易保存遠大於10000*100000
數字(您需要在每邊再加上4-5個數字才能使64位數字溢出),但是該范圍內的數字可能會導致32位溢出數學,因為它大於〜2000000000。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.