fill函式與程式設計無窮大

2021-07-29 11:12:10 字數 1998 閱讀 7838

程式設計中無窮大的設定

很多人可能設為0x7fffffff,這個數的確是32-bit int的最大值,符號位為0,其他的都是1

但在很多情況下,0x7fffffff會出現錯誤,比如溢位,這樣兩個無窮大數相加會變成負數,還有如在做dijkstra求最短路時,當做鬆弛操作,判斷if (d[u]+w[u][v]

為了盡量避免以上的錯誤,我們可以改變無窮大的設定,可以將0x3f3f3f3f設為無窮大,0x3f3f3f3f的10進製表示為1061109567,這個數已達到10^9,足以表示無窮大,又

0x3f3f3f3f+0x3f3f3f3f=2122219134,滿足無窮大+無窮大仍為無窮大

當把無窮大設為0x3f3f3f3f時,在做初始化時也很方便,比如在初始化陣列a時,可以使用

memset(a,0x3f,sizeof(a)),因為0x3f3f3f3f的每個位元組都是0x3f,如果使用0x7fffffff,需要迴圈賦值,耗費更多時間

memset

和fill_n比較

1.memset

是對每個位元組賦值,而int有4位元組(32位)

比如這樣,memset(a,1,sizeof(a));

則a中的每個元素都被賦值成為2進製數為,00000001000000010000000100000001,的數

轉換成10進製就是16843009

所以,一般用memset對陣列賦0或-1,賦其他的值就要用迴圈來實現.

函式名: memset

//

要包含標頭檔案

功 能: 設定s中的所有位元組為ch, s陣列的大小由n給定

用 法: void *memset(void *s, char ch, unsigned n);

程式例:

#include

#include

#include

int main(void)

注意它的用法,不一定是賦為0,其實就是把乙個陣列的每個單元寫上ch,說明了就是寫上乙個數.

對於對int之類的陣列,只能用memset對其初始化為0或-1。

如:int a; memset(a,0,sizeof(a)):

//sizof(a)=sizeof(int)*n;

而對於char型,可以賦任何字元。

如:char a; memset(a,'0',sizeof(a));//sizeof(a)=1*n;

2,fill_n(void *s,unsigned n,char n)

//要包含標頭檔案

與memset的不同不僅在於函式引數的順序,而且對int型的陣列賦值,fil_n可以賦任何值,而memset只能賦0或-1.

memset

最快,測試的資料型別的位元組越小越有優勢,

for與

while

相差無幾,

fill

最慢,看了下

sgi下的

fill()

的源**,採用的是

for(;first!=last;first++) *first=val;

的方式,然後針對

char

型的是用的

memset,

我的理解是因為

memset

對多位元組的資料型別不能賦成特定的值,所以才採用的

for()

,也間接說明了

memset

比for

應該要快吧。。

python無窮大 Python 表示無窮大的數

我之前只知道設定初始值0.今天偶然在python演算法書上看到這個片段,從100個隨機數裡面找2個最靠近的自然數 不相等 from random importrandrange seq randrange 10 10 for i in range 100 dd float inf for x ins...

程式設計中的無窮大

在網上看別人 的時候,經常會看到他們把inf設為0x7fffffff,因為這是32 bit int的最大值。如果這個無窮大只用於一般的比較 比如求最小值時min變數的初值 那麼0x7fffffff確實是乙個完美的選擇。if d u w u v 如果u,v之間沒有邊,那麼w u v inf,如果我們的...

無窮大無窮小

如果問題中各資料的範圍明確,那麼無窮大的設定不是問題,在不明確的情況下,很多程式 員都取0x7fffffff作為無窮大,因為這是32 bit int的最大值。如果這個無窮大只用於一般的比較 比如求最小值時min變數的初值 那麼0x7fffffff確實是乙個完美的選擇,但是在更多的情況下,0x7fff...