算法競賽中能夠注意的小細節

一、定義π的時候能夠經過C庫函數的acos()實現
(一般儘可能用const關鍵字聲明常數)linux

const double pi=acos(-1.0);

acos()函數的聲明:windows

double acos(double x);

參數:數組

x——浮點值在區間[-1,+1]

返回值:函數

返回x的反餘弦,在區間[0,π]弧度.

二、數據類型的範圍測試

int            min  -2147483648
               max   2147483647               10^10
unsigned int   min   0
               max   4294967295               10^10
long long      min  -9223372036854775808 
               max   9223372036854775807      10^19

代碼驗證:spa

int main()
{
    int i=1;
    while(i>0)
    i++;

    cout<<"min   "<<i<<endl;
    cout<<"max   "<<i-1<<endl;
    return 0;
}

double型浮點數能精確到多少位小數:16位 (15~16)
float型浮點數能精確到多少位小數: 7位 (6~7)操作系統

代碼驗證:命令行

double i = 1.0, j = 3.0;
    
printf("%.20lf\n",i/j);//超過必定位數就會開始產生錯誤數據

double存儲最大字節數 : 8
double型浮點數最大正數值:1.7976931348623158e+308
(可是注意,初始化的數字位數過長,會致使編譯器內部緩衝溢出)指針

代碼驗證:code

int main(){
    double i=0.0000000000000001;
    for(;i>0;i+=0.0000000000000001){
        
    }
    printf("%.100lf\n%.100lf\n",i,i-1);
    return 0;
}

float 存儲最大字節數 : 4
float 最小值: 1.175494E-38
float 最大值: 3.402823E+38
精度值: 6

代碼驗證:

#include <stdio.h>
#include <float.h>
 
int main()
{
   printf("float 存儲最大字節數 : %lu \n", sizeof(float));
   printf("float 最小值: %E\n", FLT_MIN );
   printf("float 最大值: %E\n", FLT_MAX );
   printf("精度值: %d\n", FLT_DIG );
   
   return 0;
}

三、需注意的優先級

邏輯運算符優先級:!> && > ||  不過最好加括號咯    
按位與& > 按位異或^ > 按位或|

四、stdio是standard I/O的縮寫 頭文件只包含函數的聲明和一些宏定義,真正的函數定義在庫中,編譯時用不上,連接時纔會加入進去

五、floor()返回不超過x的最大整數 向下取整,直接去掉小數部分
floor(x+0.5)就能夠實現四捨五入啦

六、測試程序運行時間:

printf("Time used = %.2lf\n", (double)clock()/CLOCKS_PER_SEC);//頭文件<time.h>,以秒爲單位

七、爲了不輸入數據的時間影響測試結果,可使用「管道」

在windows命令行下 執行 echo 20|abc 操做系統會自動把20輸入,其中abc是程序名
linux下須要輸入echo |./abc 由於默認狀況下,當前目錄不在可執行文件的搜索路徑中

八、輸入輸出重定向

freopen("in.txt","r",stdin); 
 freopen("out.txt","w",stdout); //在正式提交的時候要記得註釋掉

Windows 下用fc命令進行文件比較 Linux下 diff

有一種方法在本機測試時用文件重定向,可是一旦提交到比賽就自動刪除的重定向語句(只須要刪除#difine LOCAL)

#define LOCAL//只有定義了符號LOCAL,才能編譯裏面兩條語句
int main()
{
    #ifdef LOCAL
     freopen("in.txt","r",stdin); 
     freopen("out.txt","w",stdout);
    #endif
}
#include <fstream>
using namespace std;
ifstream fin("test.in");
ofstream fout("test.out");
int main()
{
    int a,b;
    while(fin>>a>>b)
    fout<<a+b<<"\n";
    return 0;
}

//若是想要標準輸入,只須要把fin和fout的聲明語句去掉
//而後加上這兩行:#define fin cin
             #define fout cout
//用輸入輸出流時,標準輸入流cin比文件流fin慢不少

更好的方法是在編譯選項中定義LOCAL而不是在程序中,這樣在提交的時候就不用刪除了.
(實施方法留待補充)

若比賽要求用文件輸入輸出,但禁用重定向方式,解決方法:

int main(){    
    FILE *fin,*fout;
    fin=fopen("data.in","rb");
    fout=fopen("data.out","wb");
    ...
    fscanf(fin,"%d",&x);
    fprintf(fout,"%d\n",x);
    fclose(fin);
    fclose(fout);
    return 0;
    }

注意:若是想把fopen版的程序改爲讀寫標準輸入輸出,只需賦值:

fin=stdin;
fout=stdout;

不需調用fopen和fclose.

重定向:寫起來簡單天然,可是不能同時讀寫文件和標準輸入輸出
fopen:雖然繁瑣,可是靈活性較大(eg:能夠反覆打開並讀寫文件)
!還有一個條件編譯 待了解和熟悉掌握!!!

九、while循環時最好是判斷一下scanf()的返回值.

十、注意數組放在main()函數外才能開的很大,放在裏面的時候稍微過大就會異常退出

十一、要把數組a複製k個元素到數組b:

memcpy(b,a,sizeof(int)*k);//頭文件string.h
memcpy(b,a,sizeof(a));//a中元素所有複製

十二、scanf("%s",s);會讀入一個不含空格、TAB、回車符的字符串//char s[maxn]

strchr(s,'a');//在一個字符串中查找單個字符
sprintf(buf,"%d%d%d%d%d",a,b,c,d,e);//輸出到字符串buf,注意保證buf有足夠空間

strlen(s)能夠返回字符串s中結束標記以前的字符個數 strcpy(a,b),strcmp(a,b),strcat(a,b)
1三、用typedef定義結構體

typedef struct {    doublex,y;    }Point;

1四、指針問題

int *a;//聲明的變量a 是指向int型變量的指針;
a=&b;//把變量b的地址存放在指針a中
//(*a)表示a指向的變量
//注意指針若是沒有賦初值,你不知道它指向哪裏,若是它指向系統區,不可被寫入,程序可能會崩潰

計算左閉右開區間內元素和:(關於數組做爲參數傳遞問題)兩種sum重要寫法

//方法一:
int sum(int *begin,int *end)
{
    int n=end-begin;//數組形式傳遞的實際上是數組首地址
    int ans=0;
    for(int i=0;i<n;i++)
    ans+=begin[i];

    return ans;
}
//方法二:
int sum(int *begin,int *end)
{
    int *p=begin;//注意定義指針時必定要記得給它賦初值
    int ans=0;

    for(int *p=begin;p!=end;p++)
    ans+=*p;

    return ans;
}

1五、讀取一整行的方法:

//方法一:
string  line;
getline(cin,line);
//方法二:
char str[maxn];
cin.getline(str,maxn);//讀入char數組
//cin.getline第三個參數表示間隔符,默認爲換行符'\n'。讀入不須要考慮最後的換行符。
//方法三:
char buf[maxn];//讀取不超過maxn-1個字符
fgets(buf,maxn,fin);//可使用它兄弟gets()可是不推薦
//方法四:
char str[1024];
int i=0;
while((str[i]=getchar())!='\n')
    i++;
getchar();
//說明:這樣一個一個讀也能夠,也會把開頭的空格讀進來。最後也須要考慮換行符,使用getchar()讀處理。
//方法五:
char str[1024];
scanf("%[^\n]",&str);
getchar();

scanf函數也可完成這樣的功能,並且還更強大。這裏主要介紹一個參數,%[ ],這個參數的意義是讀入一個字符集合。[ ]是個集合的標誌,所以%[ ]特指讀入此集合所限定的那些字符,好比%[A-Z]是輸入大寫字母,一旦遇到不在此集合的字符便中止。若是集合的第一個字符是"^",這說明讀取不在"^"後面集合的字符,既遇到"^"後面集合的字符便中止。注意此時讀入的字符串是能夠含有空格的,並且會把開頭的空格也讀進來。
注意:若是要循環的屢次從屏幕上讀取一行的話,就要在讀取一行後,在用%c讀取一個字符,將輸入緩衝區中的換行符給讀出來。不然的話,在下一次讀取一行的時候,第一個就遇到'n',匹配不成功就直接返回了。這裏能夠用scanf()或者getchar()函數讀取換行符。

1六、結構體的一種賦值方式(我日常比較少用)

template <typename T>
Struct Point{
    T x,y;
Point(T x=0,T y=0):x(x),y(y){};
};

1七、

相關文章
相關標籤/搜索