發現C 使用memset乙個很有趣的問題

2021-10-21 17:53:06 字數 1114 閱讀 5751

使用memset函式的小問題

最近在符習演算法的知識,今天作杭電oj的1114題,乙個揹包問題。

最後要求的是可能的硬幣的最小值,所以先把揹包初始化成乙個自定義的極大值inf再進行計算,開始寫的程式如下:

#include

#include

#include

using namespace std;

#define inf 990000

int

main()

for(

int i=

0;i)for

(int j=weight[i]

;j<=v;j++

) bag[j]

=min

(bag[j]

,bag[j-weight[i]

]+price[i]);

if(bag[v]

==inf)

cout<<

"this is impossible."

cout<<

"the minimum amount of money in the piggy-bank is "

<<<

"."<}return0;

}

結果發現所有樣例的結果都是impossible,看了該題discuss,發現ac大佬這一句

if

(bag[v]

==inf)

寫的是這樣

if

(bag[v]

==bag[

10008

])

改了之後果然對了,於是乎我直接輸出了bag[10008],結果並不是想象中的inf值,而是乙個奇奇怪怪的值808464432。

這就很有意思了,輸出memset後的值居然不是初始化的值?難道是因為陣列太大了,在計算過程中有什麼玄學錯誤?

於是我又寫了幾個簡單的程式測試了一下,發現不管陣列大小,直接輸出memset初始化後的陣列的任意乙個值,都是乙個奇奇怪怪的數而非我們設定的值。

具體原因應該與memset的實現方式有關,這裡先記錄下來,以後有空好好研究一下。

發現乙個很有意思的C語言指標小知識

先貼 給你們湊乎湊乎 include include include void test for i 0 i n i p i i for i 0 i n i printf d n p i free p getch void test1 int n,i int p p a for i 0 i 5 i ...

乙個memset函式使用時的坑

平時使用memset函式都是用來初始化字串,從來沒有注意過它具體是怎麼實現的,最近無意中發現原來這個函式裡面還是有坑的。我嘗試用它來初始化整型陣列 int array 10 memset array,1,sizeof a 我原本是想將陣列元素全部初始化為1,可是卻是這樣的 一開始不明白為什麼會這樣,...

乙個小發現

最近在看一些筆試題目,比如說諸如 例一 解答 變換一次就成為為1的只有 2 2 2 變換兩次就成為1的也只有乙個4 4 2 2 2 變換三次就成為1的有兩個數 3 3 1,4 2,2 2 和 8 8 2,4 2,2 2 變換四次就成為1的有三個數6 7 和16 就不一一列了 所以發現這是乙個fib數...