2023年1月19日訓練日記

2022-06-06 04:54:11 字數 3439 閱讀 1091

今天的部落格寫的有點晚了,本來是想今天下午寫的,但是一直沒拿到電腦,現在寫好去睡覺。

今天涉及到的題目有乙個是這樣的:

越界問題:

輸入兩個int範圍內的整數a和b,

你需要判斷如果a和b都是用int型別儲存的,a+b在c++中是否越界了(也就是結果是否還在int範圍內)。

注意越界有上界和下界。

然後對於越界問題,搜了一下,得出下面的一些結論:

int、long、long long取值範圍

unsigned int 0~4294967295

int -2147483648~2147483647

unsigned long 0~4294967295

long -2147483648~2147483647

long long的最大值:9223372036854775807

long long的最小值:-9223372036854775808

unsigned long long的最大值:18446744073709551615

__int64的最大值:9223372036854775807

__int64的最小值:-9223372036854775808

unsigned __int64的最大值:18446744073709551615

另外做另乙個題時,涉及到之前沒有學過的位運算,去搜了一下,有以下結論:

位運算總結(按位與,或,異或)

按位與運算子(&)

參加運算的兩個資料,按二進位制位進行「與」運算。

運算規則:0&0=0; 0&1=0; 1&0=0; 1&1=1;

即:兩位同時為「1」,結果才為「1」,否則為0

例如:3&5 即 0000 0011& 0000 0101 = 00000001 因此,3&5的值得1。

另,負數按補碼形式參加按位與運算。

「與運算」的特殊用途:

(1)清零。如果想將乙個單元清零,即使其全部二進位制位為0,只要與乙個各位都為零的數值相與,結果為零。

(2)取乙個數中指定位

方法:找乙個數,對應x要取的位,該數的對應位為1,其餘位為零,此數與x進行「與運算」可以得到x中的指定位。

例:設x=10101110,

取x的低4位,用 x & 0000 1111 = 00001110 即可得到;

還可用來取x的2、4、6位。

按位或運算子(|)

參加運算的兩個物件,按二進位制位進行「或」運算。

運算規則:0|0=0; 0|1=1; 1|0=1; 1|1=1;

即 :參加運算的兩個物件只要有乙個為1,其值為1。

例如:3|5 即 00000011 | 0000 0101 = 00000111 因此,3|5的值得7。

另,負數按補碼形式參加按位或運算。

「或運算」特殊作用:

(1)常用來對乙個資料的某些位置1。

方法:找到乙個數,對應x要置1的位,該數的對應位為1,其餘位為零。此數與x相或可使x中的某些位置1。

例:將x=10100000的低4位置1 ,用x | 0000 1111 = 1010 1111即可得到。

異或運算子(^)

參加運算的兩個資料,按二進位制位進行「異或」運算。

運算規則:0^0=0; 0^1=1; 1^0=1; 1^1=0;

即:參加運算的兩個物件,如果兩個相應位為「異」(值不同),則該位結果為1,否則為0。

「異或運算」的特殊作用:

(1)使特定位翻轉找乙個數,對應x要翻轉的各位,該數的對應位為1,其餘位為零,此數與x對應位異或即可。

例:x=10101110,使x低4位翻轉,用x ^0000 1111 = 1010 0001即可得到。

(2)與0相異或,保留原值 ,x ^ 00000000 = 1010 1110。

下面重點說一下按位異或,異或其實就是不進製加法,如1+1=0,,0+0=0,1+0=1。

異或的幾條性質:

1、交換律

2、結合律(即(ab)c == a(bc))

3、對於任何數x,都有xx=0,x0=x

4、自反性: abb=a^0=a;

異或運算最常見於多項式除法,不過它最重要的性質還是自反性:a xor b xor b = a,即對給定的數a,用同樣的運算因子(b)作兩次異或運算後仍得到a本身。這是乙個神奇的性質,利用這個性質,可以獲得許多有趣的應用。 例如,所有的程式教科書都會向初學者指出,要交換兩個變數的值,必須要引入乙個中間變數。但如果使用異或,就可以節約乙個變數的儲存空間: 設有a,b兩個變數,儲存的值分別為a,b,則以下三行表示式將互換他們的值 表示式 (值) :

a=a^b;

b=b^a;

a=a^b;

應用舉例1:

1-1000放在含有1001個元素的陣列中,只有唯一的乙個元素值重複,其它均只出現

一次。每個陣列元素只能訪問一次,設計乙個演算法,將它找出來;不用輔助儲存空

間,能否設計乙個演算法實現?

解法一、顯然已經有人提出了乙個比較精彩的解法,將所有數加起來,減去1+2+…+1000的和。

這個演算法已經足夠完美了,相信出題者的標準答案也就是這個演算法,唯一的問題是,如果數列過大,則可能會導致溢位。

解法二、異或就沒有這個問題,並且效能更好。

將所有的數全部異或,得到的結果與123…1000的結果進行異或,得到的結果就是重複數。

左移運算子(<<)

將乙個運算物件的各二進位制位全部左移若干位(左邊的二進位制位丟棄,右邊補0)。

例:a = a<< 2將a的二進位制位左移2位,右補0,

左移1位後a = a *2;

若左移時捨棄的高位不包含1,則每左移一位,相當於該數乘以2。

右移運算子(>>)

將乙個數的各二進位制位全部右移若干位,正數左補0,負數左補1,右邊丟棄。

運算元每右移一位,相當於該數除以2。

例如:a = a>> 2 將a的二進位制位右移2位,

左補0 or 補1得看被移數是正還是負。

不同長度的資料進行位運算

如果兩個不同長度的資料進行位運算時,系統會將二者按右端對齊,然後進行位運算。

以「與」運算為例說明如下:我們知道在c語言中long型佔4個位元組,int型佔2個位元組,如果乙個long型資料與乙個int型資料進行「與」運算,右端對齊後,左邊不足的位依下面三種情況補足,

(1)如果整型資料為正數,左邊補16個0。

(2)如果整型資料為負數,左邊補16個1。

(3)如果整形資料為無符號數,左邊也補16個0。

如:long a=123;int b=1;計算a& b。

如:long a=123;int b=-1;計算a& b。

如:long a=123;unsigned intb=1;計算a & b。

發現了很多位運算的奇妙之處,原來位運算是可以代替引入第三者交換a,b值的,是可以更快更簡潔的找到重複值的,是可以減輕記憶體負擔的······

關於位運算,看來以後還要多了解練習一下。

2023年1月19日假期訓練日記

51nod上的題目是真多啊,我想跳著寫都不知道該怎麼跳?做了幾個列印圖形的題,都用到了setw函式控制域寬,對於setw函式,含義看了好多遍,能理解什麼意思,但做題就對不上號。幸虧我用的時候沒有死摳含義,按照另外的想法通過了實踐。我盡量把控制域寬的含義跟實踐對應起來,但有時候吧,我覺得對於知識會用就...

2023年8月19日訓練日記

上午開了乙個多小時的會,總結了一下自己的收穫,以及學習方法的改變,我感覺我最大的改變就是現在看書看到很難的部分也能靜下心來去認真琢磨。然後就是心態,現在遇到錯誤和bug能靜下心來去調bug找錯誤,也不是很慌了。然後上午把昨天codeforces的d題補了一下,下午看完了bst二叉檢索樹,資料結構真是...

2023年1月14日訓練日記

今天主要是打了比賽,然後嘗試補cf的一道e題,一直t,明天繼續補。比賽沒怎麼認真打。額,隨便做做 a題中國剩餘定理,b題暴力,c題無向圖定向使強連通 我部落格裡幾乎寫過原題,見圖論 牛客網25e d題bfs預處理o 1 回答,之前做過很多類似的 比賽的時候時間不夠,沒做出來 e題簡單dp 二維三維皆...