C 中1e9(初始化 無窮大)解析

2021-10-09 03:11:55 字數 2278 閱讀 5329

對新手友好,簡單易於理解

前言:

c++初學者遇到1e9時,可能會很好奇,這個表示什麼意思?有什麼用?遇到的一些問題為什麼要這麼處理?以下是個人的一些理解。

1.什麼是1e9

通常來說這是計算機中一種科學計數法的表示形式:

1e9 = 110^9 = 1000000000;

例如:9e8 = 910^8 = 900000000;

e表示10,e後面的數字表示次方,e的多少次方。

2.c++中的1e9

int num1 =

1e9;

int num1 =

1e10

;輸出的結果為:

num1 =

1000

000000;

num2 =

1410

065408;

那麼問題來了,為什麼num2 不等於 10000000000 ?

c/c++中int型別是32位的,範圍是-2147483648 到 2147483647。

int占用4個位元組,也就是32位,除了第一位代表符號,剩下的31位可用。

十進位制的 1e10時,轉換為二進位制:

100101 0100 0000 1011 1110 0100 0000 0000前兩位出現資料溢位問題。

而0101 0100 0000 1011 1110 0100 0000 0000 轉換成十進位制就是 1 410 065 408

3.c++中某個變數初始化賦值為1e9

int count =

1e9;

res =

min(res, count)

;

實際中遇到的一些問題,或者解決一些演算法問題時,會遇到給某個變數初始化並賦值為1e9。接著後面會出現一些**計算最小值。

這時,1e9的作用是給變數賦乙個初始極大值,原因在於後面的**中需要取此變數和其他變數的最小值。初始化為乙個最大值,亦即初始化為無窮,便於後面極小值的比較和獲取,屬於初始化的目的。

有時我們需要比較大小,或者在matlab等其語言中為取無窮,我們只需取乙個很大的值即可。c++中取1e9,10的九次方就是一種方法,代表乙個很大的值。

4.c++中表示正無窮與負無窮

正無窮:0x3f3f3f3f

負無窮:0xc0c0c0c0

int a=

0x3f3f3f3f

;int b=

0xc0c0c0c0

; 輸出:

a=1061109567

b=-1061109568

5.mod 1e9+7

在一些演算法題目中,會遇到這樣的情況:

由於結果可能較大,將結果mod 1e9+7,即mod 1000000007 。

或者( a * b ) % c = [ ( a % c ) * ( b % c ) ] % c 而這個c最常見的還是1e9+7。

有時候結果比較大的時候,會對結果進行mod 1e9+7操作。為什麼呢?

第一:

1e9+7是乙個很大的數,int32位的最大值為2147483647,所以對於int32位來說1000000007足夠大。int64位的最大值為2^63-1,對於1000000007來說它的平方不會在int64中溢位所以在大數相乘的時候,因為(a∗b)%c=((a%c)∗(b%c))%c,所以相乘時兩邊都對1000000007取模,再儲存在int64裡面不會溢位。有點於歸一化的意思。

當乙個問題只對答案的正確性有要求,而不在乎答案的數值,可能會需要將取值很大的數通過求餘變小

第二:

其次,1e9+7是乙個質數,在模素數p的情況下a*n(a非p的倍數)的迴圈節長為p,這是減少衝突的乙個原因。另一方面模素數p的環是無零因子環,也就是說兩個非p倍數的數相乘再模p不會是零(如果是0的話,在多個數連乘的情況下會大大增加衝突概率)。比如說如果所有的結果都是偶數…你模6就只可能出現0, 2, 4這三種情況…但模5還是可以出現2, 4, 1, 3這四(4=5-1)種情況的… hash表如果是用取模的方法也要模乙個大質數來減少衝突,出題人也會這樣來 希望減少你「矇對「的概率。

如果這篇文章對你有用的話,下方的一鍵三連,感謝感謝!

c 中的初始化

當物件建立是就獲得了乙個特定的值,我們就說這個物件被初始化了。c 物件初始化通常有4種形式,但並非每種風格都支援所有型別,下面是對各種風格的總結。通常初始化的4種形式 int units solds 0 int units solds 0 int units solds int units sold...

C 中的初始化

這裡概括性的討論了c 中的初始化規則,一些具體型別還需單獨討論。1 當物件在建立時獲得了乙個特定的值,我們說這個物件被初始化了。用於初始化變數的值可以是任意複雜的表示式。2 初始化不是賦值,初始化的含義是建立變數時賦予其乙個初始值,而賦值的含義是把物件的當前值擦除,以乙個新值來代替。3 初始化可分為...

C 中陣列初始化

include using std cout using std endl int arr1 5 int arr2 5 int main int pi1 new int 5 int pi2 new int 5 for int i 0 i 5 i cout arr1 i cout endl for i...