程式書寫過程中的一些小技巧:
1. freopen(“1.txt”,”r”,stdin); //程式運行後系統自動輸入此文檔裡面的內容(不需要進行手動輸入)
freopen(“1.txt”,”w”,stdout); //程式輸出的內容儲存在此檔案裡
2. memset(a,0,sizeof(a)); //數組的初始化。一般定義一個數組都要初始化
數組定義int a[10] 為全域變數的話,其全部元素預設賦值為0;整型資料預設為0,字串預設為空白。
3. #define max 0x0ffffff; //max 為正無窮
#define min -0x0ffffff;
4. 多組測試資料使用 while(n--){ 程式 }
5. 一般用C語言節約空間,要用C++庫函數或STL時才用C++;
cout、cin和printf、scanf最好不要混用。而且需要注意的是,如果題目是大規模資料的輸入輸出,盡量使用printf和scanf,資料量一大,速度明顯比c++的輸入輸出快。 輸出1000000個資料,cout 大概用6s printf 用了0.562s
6. 有時候int型不夠用,可以用long long或__int64型(兩個底線__)。
實值型別表示值介於 -2^63 ( -9,223,372,036,854,775,808) 到2^63-1(+9,223,372,036,854,775,807 )之間的整數。
printf("%I64d",a);
printf("%lld",a);
7. OJ判斷是只看輸出結果的。
所以大部分題處理一組資料後可以直接輸出,就不需要用數組儲存每一個Case的資料。
8. 純字串用puts()輸出,會增快速度。
9. 先用scanf(),再用gets()會讀入斷行符號。scanf("%c%c",&c1,&c2) 後者會讀入空格和斷行符號;要使用getchar()吸收空格和斷行符號的錄入,使用c語言讀字元和字串一定要十分小心。盡量寫好就自己輸出一下看看是否是自己需要的值被讀入。
10. 讀到檔案的結尾,程式自動結束
while( ( scanf(“%d”,&a) ) != -1 )
while( ( scanf(“%d”,&a) ) != EOF)
while( ( scanf(“%d”,&a) ) == 1 )
讀到一個0時,程式結束
while( scanf(“%d”,&a) &&a)
讀到多個0時,程式結束
while( scanf(“%d%d%d”,&a,&b,&c)&&a+b+c ),該方法不能讀取負值。
11. 圓周率=cos(-1.0) 自然對數=exp(1.0)
12. 如果要乘或除2^n,用位移運算速度快。a>>n;a<<n; 如:求n^m 時間複雜度log(m)
int calc(int n,int m){
int re=1;
while(m){
if(m&1)
re*=n;
n*=n;
m>>=1;
}
return re;
}
13. 定義數組時,數組大小最好比告訴的最大範圍大一點。字元數組大小必須比字串最大長度大1。
14. 習慣使用三目運算子
int max(int a,int b){return a>b?a:b;}
int gcd(int m,int n){return n?gcd(n,m%n):m;}
int abs(int a){return a<0?-a:a;}
15. 有的題資料範圍小但是計算量大可以用打表法,先把結果算出來儲存在數組裡,要用時直接取出來。
16. 大概的計算自己程式的時間的方法:引入標頭檔:#include<time.h> 主函數末尾添加上一句cout<<(double)clock()/CLOCKS_PER_SEC;但是輸入必需重新導向,不然會計算輸入資料等待時間。
17. runtimeerror 一般這種錯誤都是下標越界或者是未賦值的變數就直接使用這兩種情況,一定要好好排查,不仔細一般找不出來。另外還有在函數內開了一個比較大的數組,使堆棧耗盡所以出錯。 這個是後來加上的