簡體   English   中英

如何在C ++中計算大數?

[英]How to calculate large numbers in C++?

我對編程很陌生,遇到一個“簡單”問題來計算算術級數的總和:

我知道公式就像: (2*a + (n-1)*d) * n/2

adnint n可以是10000左右,而ad可以是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-1long long (因此為64比特的最小值)。 這意味着與此相關的任何數學運算也都需要轉換為long long ,因此dlong 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM