編程知識點(C/C++)

//基本框架

#include<bits/stdc++.h>

using namespace std;

int main()

{

while(~scanf() )或while(scanf()!=EOF)   //※※題目要求多組測試用例時必須加while※※(~爲取反操作,EOF爲-1)

   {

          printf();

          //scanf 的輸入速度比 cin 快得多,推薦使用scanf與printf進行輸入輸出,且不要與cin/cout混用,否則輸入或輸出結果可能會出紊亂問題。scanf 是 C 語言的函數,string類型變量無法直接用scanf/printf進行輸入/輸出,輸入則需要藉助char數組, 可以藉助c_str()函數進行輸出。例:string s; char ss[5000]; scanf("%s",ss); s=ss; printf("%s\n",s.c_str());(c_str()的作用是返回一個C風格的字符串臨時指針,可通過strlen(ss)計算char數組中字符串的長度,不包括'\0'在內)。

return 0;

}

※return 0;

※※#include<bits/stdc++.h>

 

用右移運算符代替了除以2,用位與運算符(&0x1)代替了求餘運算符(%)來判斷一個數是奇數還是偶數。位運算的效率比乘除法及求餘運算的效率要高很多。

 

 

1B=2個16進制數=8b

 

NULL是代表空的關鍵字,而null並不是關鍵字,null在C/C++沒有聲明跟定義。

 

char a,c;scanf("%c",&a);scanf("%c",&c);//用scanf輸入單個字符時,後一次的輸入會喫前一次輸入結尾的空格或回車(因爲scanf("%c",&c);可以接收回車、空格等任意單字符),解決方案是scanf(" %c",&c)即在%c前加個空格用來吸收上次輸入結尾的空格或回車或是用getchar()吸收這個字符。

 

指針變量必須先賦值,才能正常使用,故創建結構體指針後,在對該指針所對應結構體的數據進行操作前必須想給該指針所指結構體變量賦值,可以把一個已有指針賦給它或是用new 結構體名;或(結構體名*)malloc(sizeof(結構體名));給指針申請一個空間,new與delete搭配,malloc()與free()搭配。使用格式區別:delete 結構體名;free(結構體名);//因爲new與delete是操作符,而malloc()與free()是庫函數。

 

求char數組的長度:

函數原型:unsigned int strlen(char *s);

頭文件:#include <string.h>;

參數說明:要計算長度的字符串數組的首地址;

功能:計算給定字符串的(unsigned int型)長度,不包括'\0'在內;

 

ios::sync_with_stdio(false);  //關閉不同輸入輸出方式的同步,可以加快cin/cout速度,但是速度還是不如scanf/printf快,且關同步後不同類型的輸入輸出方式不可以混用,例:cin/cout不可以與scanf/printf 、getchar()/puts() 等其他輸入輸出方式混用。

 

格式化輸入問題:

※①scanf("%d:%d:%d",&x,&y,&z);   //引號中爲輸入數據的格式,後面即可直接分離出數據,例:2013:4:12可直接分離出x=2013、y=4、z=12

②string s="2013:4:12";

   sscanf(s.c_str(),"%d:%d:%d",&x,&y,&z);  //可以分離出字符串s中的數據(可參考《ACM程序設計》P35)s.c_str()的作用是返回一個C風格的字符串臨時指針

③20110412 無空格等分隔符格式,scanf ("%4d%2d%2d",&x,&y,&x);//使用長度控制符進行輸入賦值

 

break只能跳出一重循環,利用goto可以跳出整個循環;continue是結束此次循環進行下一輪循環。

goto g;

g: ........;

 

若題目要求時間限制爲1s即1000ms,則算法複雜度不能超過一千萬即10^7。即若算法複雜度爲O(n^2),則n不能超過3000,否則需要換複雜度更低的算法。若時間限制不是1000ms則根據1000ms的最大複雜度進行類推。空間大小一般爲2^26B即65536KB,可根據給出的空間大小的限制計算不同類型數據所能申請數組的最大長度(short:16位即2B,int:32位即4B,long long:64位即8B;float:32位即4B,double:64位即8B;char:8位即1B)。

 

 

int abs(int i);                   // 對int型數據取絕對值

double/float fabs(double/float i);   //對浮點型數據取絕對值

 

※while (fabs(a-b)<1.0E-6)  //判斷兩個浮點數a、b是否相等

   浮點數判斷兩個數相等不能直接使用 == 運算符,要相減後判斷其絕對值小於1.0e-6即0.000001或1.0e-7, 一般就認爲它們是相等的了(因爲浮點數表示存在精度問題,完全==比較難,但是判斷斜率等需要高精度的值是否相等時可直接用==判斷)。

 

閏年:能被400整除或能被4整除但不能被100整除的年份

閏年2月29天,共366天;

平年2月28天,共365天

 

memset(a,int,sizeof(a));//初始化函數,具體注意事項見信息學奧賽書

 

結構體的初始化類似於常規數據類型數組的初始化,可作爲全局變量初始化或作爲局部變量定義時初始化(全局變量默認值爲0或NULL,局部變量默認值隨機),也可用memset對結構初始化,但memset只能將結構體所有數據變量初始化同一值。

 

①sort(start,end,cmp)

參數

(1)start表示要排序數組的起始地址;

(2)end表示數組結束地址的下一位;

(3)cmp用於規定排序的方法,可不填,默認升序,可重載運算符

例:

int cmp(結構體名 a,結構體名 b)//實現結構體按h從大到小排序

{

    return a.h>b.h;

}

 

②結構體內重載小於號運算符(不能重載大於號)

bool operator <(const 結構體名 &a) const

{

  return  h>a.h;

}

 

__gcd(x,y);//求最大公約數,x、y必須是相同數據類型的整型數據,頭文件是<algorithm>

最小公倍數=x*y/最大公約數;

 

精度應至少比題設要求精度多一位(不超時的情況下可以精度更高),因爲題設精度下一位的大小會影響四捨五入的情況,而下下位則影響不到該位。

 

輸入字符:         

char ch;

cin>>ch //只能輸入非空格非回車字符

△scanf("%c",&ch);//可以輸入任意字符(包括空格、回車)

ch = getchar();//可以輸入任意字符(包括空格、回車),作用與scanf("%c",&ch);完全相同

輸出字符:

cout<<ch;//輸出一個字符

printf("%c",ch);//輸出一個字符

putchar(ch);//輸出一個字符

 

輸入字符串:(cin與scanf("%s",)輸入字符串時都不能接收空格跟回車)

char buf[100];

cin>>buf;//輸入字符串,以空格、回車結束

△scanf("%s",buf);//輸入字符串,以空格、回車結束(%c輸入單字符時可接受任意字符)

△gets(buf);//輸入一個字符串,可以包含空格,以回車結束,可以吸收掉回車符,結尾加'\0' ,

cin.get(buf,100)//輸入一個字符串,不支持string,可以包含空格,以回車結束,保留結束符       

cin.getline(buf,100)//輸入一個字符串,不支持string,可以包含空格,以回車結束,清除結束符

getline(cin,buf)//輸入一個字符串,支持string,可以包含空格,以回車結束,清除結束符,不會吸收回車符。

輸出字符串:

cout<<buf;//輸出字符串

printf("%s",buf);//輸出char字符串

printf("%s",buf.c_str());//輸出string字符串

puts(buf);//向屏幕輸出字符串,並換行

 

△多次輸入且用到scanf("%c",&ch);或gets();時注意用getchar();捕獲輸入前多餘的換行字符'\n'

 

 

C/C++ 中 NULL、'\0'、'0' 、0及空格的區別

1、NULL即空指針。在C中,NULL是指向0的指針,由 #define NULL ((void *)0)定義;在C++中,NULL就是0,由 #define NULL 0 定義。可參見 vs2013 的庫文件 string.h。

2、'\0' 是空字符常量,表示字符串的結束,ASCII碼值爲0。

3、'0'是字符0,ASCII碼值爲48。

4、0是數字0。用字符變量接收數字0時,相當於ASCII碼爲0的字符即空白符'\0'。

5、空格是可顯示字符空格,ASCII 碼值爲32。

備註:

  給指針置位爲空指針時,應該使用 NULL;

  給字符串添加結束標誌時,應該使用 '\0' ;

       空字符串""中每個元素都是空白符'\0'。

 

 

int最大值表示:0x7fffffff(int 32位,8個16進制位,1個16進制位佔4個二進制位)或用memset(a,0x7f,sizeof(a))初始化數組(0x7f7f7f7f略小於0x7ffffffff)(memset只能按字節初始化,一字節兩個16進制位)

 

奧賽書p25

unsigned int  (unsigned long)

4字節8位可表達位數:2^32=42 9496 7296  

範圍:0 ~ 42 9496 7295 (4.2*10^9)  因爲2^10≈10^3

 

int  (long)

4字節8位可表達位數:2^32=42 9496 7296  

範圍:-21 4748 3648 ~ 21 4748 3647 (2.1*10^9)

 

long long (__int64)

8字節8位可表達位數:2^64=1844 6744 0737 0960 0000  

範圍:-922 3372 0368 5477 5808 ~ 922 3372 0368 5477 5807 (9.22*10^18)

 

unsigned long (unsigned __int64)

8字節8位可表達位數:2^64=1844 6744 0737 0960 0000  

範圍:0 ~ 1844 6744 0737 0955 1615 (1.844*10^19)

 

double:

8 byte = 64 bit

範圍:1.79769e+308 ~ 2.22507e-308(有效位數10^15)

 

long double:

12 byte = 96 bit

範圍: 1.18973e+4932 ~ 3.3621e-4932(有效位數10^18)

 

最大值爲19位十進制數

 

---------------------------------------------------------------------------------------------------------------------------

英文26個字母

 

所有構造得到的中間結點(即哈夫曼樹上非葉子結點)的權值和即爲該哈夫曼樹

的帶權路徑和。

 

數學知識

 

a%b:其中變量 a,b 必須爲整型變量,而不能爲浮點數。且 b 變量必須爲非零值,若出現模零錯誤,程序會因爲該異常意外終止。在評判系統中表現爲評判系統給出了運行時錯誤。

即若 a 爲正數,則該表達式結果必爲非負數(可能爲 0);若 a 爲負數,則表達式結果必爲非正數(可能爲 0)。而表達式結果與b 的符號沒有直接關係,即 a % -b 與 a % b 的結果相同,例:負奇數%2=-1並不是正1。爲了避免出現負餘數我們只需在該餘數上加上除數再對除數求一次餘即可。

(a*b)%c=(a%c*(b%c))%c;//避免大數運算的溢出問題

(a+b)%c=(a%c+(b%c))%c;

 

若 a、b 其中之一爲零,則它們的最大公約數爲 a、b中非零的那個(因爲0除以任何數都能整除)

 

複數的模:複數的實部與虛部的平方和的正的平方根的值

 

一個三角形,邊長分別爲a、b、c,三角形的面積S可由以下公式求得:  

S=sqrt(p(p-a)(p-b)(p-c))

公式中的p爲半周長: p=(a+b+c)/2

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章