【算法竞赛入门经典(第二版)】_要点提取(第三章)
目錄
- 3.1數組
- 數組大小為常量
- x++ 與 ++x
- 比較大的數組要在main函數外聲明!
- 函數:memcpy()
- 例一:開燈問題
- 初始化的重要性
- 函數:memset()
- 取反( ! )符號妙用
- 避免輸出多余空格的技巧
- 例二:蛇形填數
- C語言簡潔的優勢
- 先判斷,再移動!
- 避免非法訪問內存!
- 3.2 字符數組
- 例三:豎式問題
- scanf("%s" , s)
- printf("%5d") 與 printf("%05d")
- sprintf()
- 函數:strlen()
- 函數:strchr()
- 3.3 競賽題目選講
- 例3-1:TeX中的引號
- 字符串的輸入
- 三目運算符
- 例3-2 WERTYU
- “重構字典新定義法”
- 例3-3 回文詞
- 函數: isalpha()
- 例3-4 猜數字的提示
- 例3-5 生成元
- 例3-6 環狀序列
- 3.4 注解與習題
3.1數組
數組大小為常量
對于新手而言,最容易犯的錯誤就是:在定義數組時,將數組的范圍定義成了變量。
錯誤示范:
但我們偶爾也會利用宏定義來設定數組范圍。
什么是“宏定義”?
就是對于整個程序中,給一個常量起個名字,例如:
x++ 與 ++x
簡單來說,對于“x++”,記住:
** 先工作,再加薪! **
也就是說,對于
來說,先將x的值賦給y再自己加一 也就是等于
y = x ; x = x + 1 ;而對于“++x” ,則是:
** 先加薪,再工作! **
等于
x = x + 1 ; y = x ;比較大的數組要在main函數外聲明!
函數:memcpy()
作者在講述兩個數組a , b之間互相復制的關系時引入了函數memcpy(),并給出了相關操作:
memcpy(b , a , sizeof(int) * k) ; //將數組 a復制 k 個元素到數組 b memcpy(b , a , sizeof(a)) ; //直接取等還可以推廣到 double 類型變量。
該函數的頭文件為:
接下來作者引入了一道例題。
例一:開燈問題
一道純種模擬題。我們可以從中學到很多。
初始化的重要性
作者在一開始就提到了初始化的重要性,尤其是在多組輸入之中,我們要格外注意。
函數:memset()
那么,我們應該如何解決初始化操作呢?尤其是多維數組,用n個for 嵌套循環實在是太麻煩了。
由此,引入了第二個函數: memset() 。
用法如下:
作用:把數組a清零。后面還會有“把數組a全部命名為-1”的操作。我們后續再說。
頭文件:
取反( ! )符號妙用
一般來說,我們只會在布爾(bool)類型中使用到取反。
作者將他推廣到了 int 類型 :
當 int a = 0 時 ,
進行 a = !a 操作就可以使 a = 1
避免輸出多余空格的技巧
設置標志變量 first ,記錄只在第一行前不輸出空格
很好理解的技巧,不多贅述。
例二:蛇形填數
C語言簡潔的優勢
可以利用C語言簡潔的語法,但前提是保持代碼的可讀性。
先判斷,再移動!
而不是走一步以后發現越界了再退回來。這不是強制性要求,但養成良好習慣十分必要。
避免非法訪問內存!
通過短路運算符“&&”來保證不會訪問非法內存。
3.2 字符數組
本節開篇引入了一個例題來講解字符數組。
例三:豎式問題
scanf("%s" , s)
作者引入了一個新概念 scanf("%s" , s) 。
他會讀入一個不含 空格 、 TAB 、 回車符 的字符串,存入數組s。
由于 s 為字符型數組,直接表示指針,因此可不用"&"(取地址符)。
printf("%5d") 與 printf("%05d")
對于一個數按5位打印,如果小于五位數,前者補空格,后者補0 。
sprintf()
sprintf(buffer , "%d%d%d" , x , y , z) ; //表示把x , y , z三個數字連在一起輸出到字符串buffer //最后的結果是 buffer 為字符串類型 // 例如 :x = 10(int) , y = 20(int) , z = 30(int) // buffer = 102030(string)由此引入了 fprintf(輸出到文件) 、printf(輸出到屏幕)、sprintf(輸出到字符串) 之間的區別。
函數:strlen()
作用:獲取字符串實際長度。
| 0 | 1 |
| 1 | 2 |
| 2 | 3 |
| … | … |
| 25 | 26 |
函數:strchr()
strchr(str , a) ; //在 str 字符串中找 a 字符 //頭文件: #include<cstring>推廣到
strcpy(a , b) ;//賦值b到a strcmp(a , b) ;//比較,若相同返回false strcat(a , b) ;//連接(放到a中)3.3 競賽題目選講
每一道例題都能學到很多知識。
例3-1:TeX中的引號
字符串的輸入
作者共介紹了3種輸入方法:
| fgetc(fin) | 讀取打開的文件fin,返回一個int值,要去除EOF符 |
| scanf("%s" , s) | 遇到空格、換行就會停下 |
| str = getchar() | 需要特判EOF符 |
| fgets(buf , maxn , fin) | 讀取文件中的一行,最多讀取maxn-1個字符,一個字符沒讀到就返回NULL |
這里沒有提到gets()因為他已經刪去了。
三目運算符
a : b ? c表示
當條件a為真時執行b反之執行c
最好不要用。
例3-2 WERTYU
“重構字典新定義法”
這里講述了一種新的算法,他類似于將答案提前寫在一個常數數組中,便于我們輸出或使用。有點類似于搜索算法中把x y值的增減提前封裝到一個數組中,是打表法的低配版。
本題中作者直接將鍵盤的格式封裝到了數組s之中,之后每次調用只需要找數組的前一位即可。
后邊還會用到他的思想。
例3-3 回文詞
又是一道“字典法”的題!
補充一下數組 msg[m*2+p]的含義是:
作者將數組分成了兩個板塊(就像是圖書館分成小說區、科普區…)m可以決定他是否是鏡像類,當是鏡像類時,m=1,此時直接去鏡像區[2,3]去找答案。反之,m=0,去非鏡像區找答案。而p決定著圖書所在的排數。
綜上就可以精準的定位答案的位置。
函數: isalpha()
isalpha() ;//檢查是否為字母 isdigit() ;//檢查是否為數字 isprint() ;//檢查是否為可打印字符 toupper() ;//轉大寫 tolower() ;//轉小寫 //頭文件: #include<cctype>例3-4 猜數字的提示
小心格式!!!!
每個數對前有空格!
例3-5 生成元
c++中 無窮大的表示方法為:
#define INF 0x3f3f3f3f例3-6 環狀序列
很好的模擬題。
輸出字符(串):
3.4 注解與習題
另發題解,請關注~
總結
以上是生活随笔為你收集整理的【算法竞赛入门经典(第二版)】_要点提取(第三章)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中tkinter的使用-中
- 下一篇: CENTOS安装XXNET