PAT——乙級1028
這道題花了我半個多小時,對呀乙級算是挺多時間的了。
1028 人口普查 (20 point(s))
某城鎮進行人口普查,得到了全體居民的生日。現請你寫個程式,找出鎮上最年長和最年輕的人。
這裡確保每個輸入的日期都是合法的,但不一定是合理的——假設已知鎮上沒有超過 200 歲的老人,而今天是 2014 年 9 月 6 日,所以超過 200 歲的生日和未出生的生日都是不合理的,應該被過濾掉。
輸入格式:
輸入在第一行給出正整數 N,取值在(0,105];隨後 N 行,每行給出 1 個人的姓名(由不超過 5 個英文字母組成的字串)、以及按
yyyy/mm/dd
(即年/月/日)格式給出的生日。題目保證最年長和最年輕的人沒有並列。輸出格式:
在一行中順序輸出有效生日的個數、最年長人和最年輕人的姓名,其間以空格分隔。
輸入樣例:
5 John 2001/05/12 Tom 1814/09/06 Ann 2121/01/30 James 1814/09/05 Steve 1967/11/20
輸出樣例:
3 Tom John
我寫的程式碼是
1 #include<cstdio> 2 3 struct People 4 { 5 char name[6]; 6int year; 7 int month; 8 int day; 9 }old,young,temp; 10 11 int compare(People a, People b) { 12 if ((a.year > 2014) || (a.year == 2014 && a.month > 9) || (a.year == 2014 && a.month == 9 && a.day > 6)) //判斷是否超過當前日期 13 return 0; 14 if((a.year < 1814) || (a.year == 1814 && a.month < 9) || (a.year == 1814 && a.month == 9 && a.day < 6))//判斷是否大於200歲 15 return 0; 16 if (a.year < b.year || (a.year == b.year&&a.month < b.month) || (a.year == b.year && a.month == b.month && a.day < b.day))//滿足上面兩個條件才比較兩個日期的大小 17 return -1; 18 if (a.year > b.year || (a.year == b.year&&a.month > b.month) || (a.year == b.year && a.month == b.month && a.day > b.day))//-1是小於,1是大於 19 return 1; 20 return 2; 21 22 } 23 int main() { 24 int n,count=0,flag1,flag2; 25 young = { "",0,0,0 }; 26 old = { "",2014,9,6}; 27 scanf("%d", &n); 28 while (n--) 29 { 30 scanf("%s %d/%d/%d", &temp.name, &temp.year, &temp.month, &temp.day); 31 flag1 = compare(temp, old);//flag1和flag2都是為了儲存判斷狀態 32 if ( flag1== -1) 33 { 34 old = temp; 35 } 36 flag2 = compare(temp, young); 37 if ( flag2== 1) 38 { 39 young = temp; 40 } 41 if (flag1 || flag2)//如果兩次判斷都不為零,也就是滿足條件,那就count+1。 42 { 43 count++; 44 } 45 } 46 if (count == 0) printf("0"); 47 else printf("%d %s %s", count, old.name, young.name); 48 return 0; 49 }
注意點:
如果所有人的生日都不滿足條件,記得必須單獨輸出一個0;否則會因為多輸出空格導致格式錯誤的。
再一次體會到PATOJ比牛客OJ更嚴格。
old = temp;
這一行是讓直接把結構體的值賦給另一個結構體。
但是用g++編譯器會報錯,提示結構體並沒有過載=
但是用clang++編譯器就不會報錯。我查了一下clang++與g++的區別
gcc/g++ 和 clang/clang++ 都是 Linux 下常用的 C/C++ 編譯器。gcc 是 GNU 親兒子。clang 是後起之秀,配合 llvm,以優秀的前端聞名於世,現在已經是 Mac(XCode) 的預設編譯器,微軟等大公司也都在使用
前景最好的應該是clang,錯誤提示/編譯速度都是一流。另外現在有很多程式碼自動完成/提示工具是基於clang的。clang編譯出的debug檔案已經可以用gdb除錯了哈,vs2015也內建了clang來提供對cross platfrom的支援。
gcc/g++/msvc因為面向了具體的platform,所以老的專案裡面可能用了他們自帶的擴充套件/或者在彼此應用環境下有一些best practice,這個沒有辦法,還得接著用。
我在我的VS2017上編譯很正常。
其他底層的我也不清楚了,反正以後用clang++就好。