以下是我們小組水題遇到問題時總結(jié)出的一些解決方法埋酬,為了減少在日后踩坑的幾率。
1.做題很多時候會遇到PE這樣煩人的情況是因為題目有個隱藏要求(有些題目會直接說明)层释,數(shù)字直接需要空格隔開简烘,而最后一個數(shù)字后面不需要帶空格。之所以會判定PE役纹,就是因為我們輸出時會慣性寫成這樣從而導(dǎo)致格式錯誤。
printf("%d ");
因此暇唾,經(jīng)過交流學(xué)習(xí)總結(jié)得出一個比較萬用的方法:
for(i=0;i<n;i++){
int flag=0;//利用flag促脉,來控制空格的輸出
if(flag){
printf(" ");
}
flag++;
printf("%d",?);
}
或者
int flag=0;
for(i=0;i<n;i++){
printf("%d",a[i]);//對數(shù)組
if(flag<n-1)printf(" ");
flag++;
}
printf("\n");
或者
for(i=0;i<n;i++){
printf("%d",?);
if(i!=n-1)printf(" ");
}
//會因題目而使判斷有點不同
2.runtime error的發(fā)生情況
1)對0求余或除以0
2)指針越界
3)數(shù)組越界
4)定義的數(shù)組過大
3.PE真的很煩人---2023(http://acm.hdu.edu.cn/showproblem.php?pid=2023)
1)控制輸出兩個數(shù)字間的空格的時候要注意m、n有不同的含義策州,要理清他們在該循環(huán)中的作用瘸味,一用反就會報PE。
2)用來作判斷的flag的初始化為0要放在循環(huán)前面够挂,否則flag會變得沒有意義旁仿,從而PE。
4.注意區(qū)分scanf和gets的使用孽糖,scanf不能接受空格枯冈、制表符Tab、回車等办悟,而gets能夠接受尘奏。
而機器會有一個bug,機器輸入全部都是輸入不帶空格的一長整行字符串病蛉,所以這就是為什么2027(http://acm.hdu.edu.cn/showproblem.php?pid=2027)
上會出現(xiàn)在編譯器里很明顯錯誤的答案去到了OJ上summit居然能AC的情況炫加。
這是在寫完后逛討論區(qū)看到的代碼瑰煎,好奇之下拿去跑了一下,當(dāng)時很是不解琢感,在與朋友交流下問題得到了解決丢间。
5.getchar()合理運用的問題
不能凡是都要getchar(),要弄清楚為什么要getchar()驹针,并了解其原理烘挫。
不然的話就很容易采坑。
比如說oj-2029(http://acm.hdu.edu.cn/showproblem.php?pid=2029)
先進入循環(huán)再getchar()輸出的結(jié)果顯然是不對的柬甥,它會先把輸入的第一個字母吞掉再進行判斷饮六。
而正確的做法是在循環(huán)之前getchar(),這樣子才能成功AC苛蒲。(ps:單純刪掉getchar()會使數(shù)據(jù)最后一行沒辦法輸入卤橄,因為gets()能讀回車。當(dāng)你輸入了n以后按下回車的時候臂外,會把你的回車當(dāng)成數(shù)據(jù)讀進去窟扑,從而影響了最后一行數(shù)據(jù)的輸入)
6.2030統(tǒng)計漢字(漢字機內(nèi)碼特點)(http://acm.hdu.edu.cn/showproblem.php?pid=2030)
原理:中文為兩個字節(jié),且最高位都為1 (<0)
ASCII: 最高位為0
也可以直接利用ASCII的范圍在0-127這個特點求解(認為不是ASCII碼即為漢字)