c語言小技巧
阿新 • • 發佈:2018-12-31
1、整數/整數=整數 浮點數/浮點數=浮點數
2、數學函式(#include<math.h>)sqrt可以用來計算整數和浮點數的算術平方根
3、pi的規範寫法pi=const doule pi=acos(-1);(#include<math.h>)儘量用const宣告常數
4、在演算法競賽中每行輸出應以回車符結束,包括最後一行
5、三變數排序:
if(a>b){t=a;a=b;b=t;}//執行完之後a<=b
if(a>c){t=a;a=c;c=t)}//執行完之後a<=c,且a<=b依然成立
if(b>c){t=b;b=c;c=t)}
6、double輸入輸出用%lf
7、判斷n是否為完全平方數用一個int型變數m儲存sqrt(n)四捨五入後的整數,然後判斷m的平方是否等於n。函式floor返回不超過x的最大整數
int m=floor(sqrt(n)+0,5);防止誤差影響+0.5
if(m*m==n)printf("%d\n",n);
8、continue是指跳回for迴圈的開始,執行調整語句並判斷迴圈條件(即直接進入下一次迴圈),而break是指直接跳出迴圈。
9、int為32位整數,範圍從-2147483648-2147483647
10、10的-6次方表示方法le-6
11、定義一個很大的常數INF,最大值等於-INF,最小值INF,可以直接使用INT_MIN;INT_MAX;
12、檔案讀取freopen("input.txt","r",stdin);從檔案input.txt讀入,freopen("output.txt","w",stdout);寫入檔案output.txt
13、比較大的陣列應儘量宣告在main函式外,否則程式可能無法執行
14、快速排序sort(a,a+n);預設升序,如果要採用降序排序
16、對於變數n,n++和++n都會給n加1,但當他們用在一個表示式中時,行為有所差別:n++會使用加1前的值計算表示式,而++n會使用加1後的值計算表示式。 17、比較大的陣列應儘量宣告在main函式外,否則程式可能無法執行。 18、從陣列a複製k個元素到陣列b,可以寫成:memcpy(b,a,sizeof(int)*k).當然,如果陣列a和b都是浮點型別的,複製時要寫成memcpy(b,a,sizeof(double)*k).memcpy包含在標頭檔案string.h中,如果需要把陣列a全部複製到陣列b中,可以寫的簡單一點:memcpy(b,a,sizeof(a)). 19、memset(a,0,sizeof(a))的作用是把陣列a清零,它也在string.h中定義 20、scanf("%s",s)中不要在s前面加上&符號,如果是字串陣列char s[maxn][maxn],可以寫成scanf("%s",s[i]);,遇到空白字元會停下來。 21、strchr的作用是在一個字串中查詢單個字元,而這個sprintf輸出到字串。strcpy(a,b),strcmp(a,b),strcat(a,b)來執行賦值、比較和連線操作。標頭檔案string.h 21、fgets(buf,maxn,fin)讀取完整的一行,其中buf宣告為char buf[maxn],這個函式讀取不超過maxn-1個字元,然後再末尾添上結束符“\0"
22、isalpha來判斷字元是否為字母,類似的還有idigit、isprint,在ctype.h中定義,寫法:isalpha(字元),toupper、tolower等工具用來轉換大小寫。
23、乘以2可以寫成“<<1",2的8次方減1可以寫成(1<<8)-1,<<運算子的優先順序沒有減法高。
24、在演算法競賽中,請總是讓main函式返回0
25、往往使用typedef struct{域定義;}型別名;的方式定義一個新型別名。這樣就可以像使用原生資料一樣使用這個自定義型別。
26、既是最終答案在所選擇的資料範圍之內,計算的中間結果仍然可能溢位。
27、iostream提供了輸入輸出流
28、algorithm提供了一些常用演算法,例如min、sort、lower_bound等函式
29、lower_bound的作用是查詢大於或者等於x的第一個位置,寫法int p=lower_bound(a,a+n,x)-a;//在已排序陣列a中尋找x,p是位置索引,找到的p是大於或者等於X值的下標。
30、double型資料開n次方的函式及寫法pow((double)m,1.0/(double)n)
bool
cmp(
int
a,
int
b)
{
return
a>b;}
sort(a,a+n,cmp);
15、結構體排序的寫法
structaray{int s;int t;}m[205];bool cmp(const aray&a,const aray & b){//變數型別為同一結構體型別if(a.s!=b.s)return a.s<b.s;elsereturn a.t<b.t;}
16、對於變數n,n++和++n都會給n加1,但當他們用在一個表示式中時,行為有所差別:n++會使用加1前的值計算表示式,而++n會使用加1後的值計算表示式。 17、比較大的陣列應儘量宣告在main函式外,否則程式可能無法執行。 18、從陣列a複製k個元素到陣列b,可以寫成:memcpy(b,a,sizeof(int)*k).當然,如果陣列a和b都是浮點型別的,複製時要寫成memcpy(b,a,sizeof(double)*k).memcpy包含在標頭檔案string.h中,如果需要把陣列a全部複製到陣列b中,可以寫的簡單一點:memcpy(b,a,sizeof(a)). 19、memset(a,0,sizeof(a))的作用是把陣列a清零,它也在string.h中定義 20、scanf("%s",s)中不要在s前面加上&符號,如果是字串陣列char s[maxn][maxn],可以寫成scanf("%s",s[i]);,遇到空白字元會停下來。 21、strchr的作用是在一個字串中查詢單個字元,而這個sprintf輸出到字串。strcpy(a,b),strcmp(a,b),strcat(a,b)來執行賦值、比較和連線操作。標頭檔案string.h 21、fgets(buf,maxn,fin)讀取完整的一行,其中buf宣告為char buf[maxn],這個函式讀取不超過maxn-1個字元,然後再末尾添上結束符“\0"