打oj題c 筆記

2021-09-30 21:04:07 字數 3179 閱讀 9053

1.printf與scanf效率比cout&cin高

2.int 範圍為32位有符號數,一般可以看做10^9內的數。超過這個範圍的多用long long(對應%lld)型別。更大的話使用結構體模擬大資料儲存。

3.浮點數一般用double(輸出時對應%lf,輸入時%f),畢竟精度高,也沒啥大影響。

4.int/int時,不會自動轉換為浮點型,結果還是int,除非強制型別轉換

eg:

int a = 1;

int b = 2;

double c = (double)a / (double)b;

5.char 型別使用ascii編碼,因此要將『0』轉換為對應整數值時,可以使用char - '0'

6.時常會出現要求格式輸出的問題,%.mf:保留m位小數輸出;%md右對齊輸出,不足的用空格補齊;%0md不足的用0補齊;%-md左對齊輸出。

7.#define定義的常量在使用時,是當做整體嵌入到使用的位置,因此很可能會出現代替後的語義與自己想實現的不同,可以多用括號分割,保證語義。

8.關於字元/字串的讀寫

(1)scanf:處理字串時,類似讀單詞,會在空格換行等符號前停止。(返回讀取資料的個數)

printf:處理字串時,一直到遇到「\0」時停止輸出

(2)gets:讀取一行,並將最後的換行符丟棄(讀到檔案尾或者出錯時返回null)

puts:輸出一行,並在最後補上換行符。遇\0停止輸出。

gets不檢查預留的儲存空間是否足夠,可能會溢位到相鄰的記憶體區,同時gets與puts不安全,建議少用。

(3)fgets:處理檔案,會一視同仁處理所有字元,能限定讀取數。使用stdin 從鍵盤讀取。

fputs:不自動新增換行符,內容完全輸出到檔案中,使用stdout,輸出到螢幕上。

(4)getchar()/putchar():讀取/輸出任意字元。

9.常用的數學函式(標頭檔案math.h)

fabs(),取絕對值,引數可以是浮點數,而abs()引數只能是整數,侷限就比較大了。

floor(double)&ceil(double)

pow(double r,double p) 求r^q

sqrt()、log()、round()(四捨五入)

11.申請陣列的大小超過10^6級別,均定義在全域性變數的地方,函式內部分配的空間並不是很大。

12.當迴圈次數過大時會出現堆疊溢位的異常。對於o(n^2)的演算法,n應該小於1000。

13.memset()初始化整形陣列時只能處理0或-1,因為對應的二進位制數分別為全0或全1.

14.字串陣列最後一位為『/0』,因此在申請陣列空間的時候,多申請一位。

15.常用的字串處理函式:

1.strlen(char*);//字元陣列長度,直到第乙個'/0',是可能超過陣列長度的。

2.strcmp(char* str1, char* str2);//按字典序比較兩個字串的大小,返回0則表示相等。

strncmp(char* str1, char* str2, int n);//比較前n個字元

3.strcpy(char* str1, char* str2);//將字串str2複製給str1(最後會有'\0')

//會把str1原有的內容覆蓋掉。並且不考慮str1陣列是否能容納

strncpy(char* str1, char* str2, int n);//按指定長度複製

4.strcat(char* str1, char* str2);//將str2拼接到str1之後,不考慮str1長度是否足夠。

strncat(char* str1, char* str2, int n);//拼接指定長度

5.sscanf(str, "%d", &n);//將str寫入n中

ssprintf(str, "%d", n);//將n寫入str中

eg:str = "2048:3.14,hello";

sscanf(str, "%d:%f,%s",&d,&f,&s);//d=2048;f=3.14;s=hello;

ssprintf(str, "%d:%f,%s",&d,&f,&);//str="2048:3.14,hello";

16.函式引數:分清區域性變數與全部變數;引數是否是引用。尤其是當形參是指標的引用時,在函式內部可能修改的是實參指向的位址,而不僅僅是實參指向的位址的內容;多維陣列作為引數時,僅第一維陣列可以不用指明大小,eg:func(int a[5]);

17.分清指標與指標指向的位址,指標指向位址的內容。

18.引用實際上是變數的別名,因此將引用作為引數時,實際傳的是本身而不是副本;並且常量是不能擁有別名的。

19.浮點數進行運算過後出現的精度問題:引入極小值eps=10^-8.實際值與理想值偏差在eps的範圍內便可以認為相等。當然還有對於大於小於等其他判斷,按照同樣方式設定與eps的關係即可。

20.21.結構體的使用

struct s

s(int _a, int _b)

}pt[10];//注意此處有分號

int main()

22.cin.getline(char*str, int len)//讀取一整行資料

23.while(scanf()!=eof){}

24.日期處理,可以先用陣列儲存平年和閏年的月份及對應天數,處理日期變化時,直接對應陣列中的資料,判斷是否需要變換。

25.進製轉換處理,記住進製轉換公式即可。

26.sort()的使用(c++ 的函式,標頭檔案algorithm,using namespace std)

int a[6] = ;

sort(a,a+6,cmp);//cmp實現增序排列

ans:1,2,3,4,5,6

比較函式cmp(),用於sort判斷何時應該交換順序:

bool cmp(int a, int b)//a>b時,a放在b前面
容器使用sort()函式:只能用於vector,string,deque

vectora;

sort(a.begin(), a.end(), cmp);//使用迭代器

bool cmp(int a, int b);//引數為容器中儲存元素的型別

27.縮小重複計算,類似於求冪級數時,會出現大量的重複的計算值,此時可以通過乙個陣列儲存這些中間值,每次使用時取出就行。

打鼴鼠 牛客OJ

題目描述 第一行為n n 1000 m m 10000 其中m表示在這一段時間內出現的鼴鼠的個數,接下來的m行每行有三個資料time,x,y表示有乙隻鼴鼠在遊戲開始後time個時刻,在第x行第y個網格裡出現了乙隻鼴鼠。time按遞增的順序給出。注意同一時刻可能出現多隻鼴鼠,但同一時刻同一地點只可能出...

OJ 陣列相關OJ刷題

1 原地移除陣列中所有的元素val,要求時間複雜度為o n 空間複雜度為o 1 給你乙個陣列 nums 和乙個值 val,你需要 原地 移除所有數值等於 val 的元素,並返回移除後陣列的新長度。不要使用額外的陣列空間,你必須僅使用 o 1 額外空間並 原地 修改輸入陣列。元素的順序可以改變。你不需...

學習筆記 九度OJ 題目1186 列印日期

題目1186 列印日期 時間限制 1 秒 記憶體限制 32 兆 特殊判題 否 提交 2549 解決 918 題目描述 給出年分m和一年中的第n天,算出第n天是幾月幾號。輸入 輸入包括兩個整數y 1 y 3000 n 1 n 366 輸出 可能有多組測試資料,對於每組資料,按 yyyy mm dd的格...