這題最有意思的是:如果生日不存在就輸出-1。
生日不存在:
1、輸入資料的不符合要求。比如時間小於0、月份大於12、天數大於31、月份和該月天數不相稱等。
2、出生是的時間是閏年的2/29,可是18年後的那一年不是閏年。
AC代碼:
#include<iostream>using namespace std;bool judgeLoopYear(int year) //判斷是否是閏年{if((year%4==0 && year%100!=0) || year%400==0)return true;return false;}bool judgeMonthDay(int year,int month,int day) //輔助判斷輸入的資料是否正確{switch(month){case 1:case 3:case 5:case 7:case 8:case 10:case 12:if(day<=31 && day>0) return true;case 2:if((judgeLoopYear(year) && day<=29 && day>0) || (!(judgeLoopYear(year) && day<=28 && day>0)))return true;case 4:case 6:case 9:case 11:if(day<=30 && day>0) return true;}return false;}bool judgeInputCorrect(int year,int month,int day) //判斷輸入的資料格式是否正確{if(year<0 || month>12 || month<=0 || day>31 || day<=0 || !judgeMonthDay(year,month,day))return false;return true;}int knowDay(int year,int month) //根據某一年得到該年某一月份的天數{switch(month){case 1:case 3:case 5:case 7:case 8:case 10:case 12:return 31;case 2:if((judgeLoopYear(year)))return 29;else return 28;case 4:case 6:case 9:case 11:return 30;}}int count(int year,int month,int day) //計算{int i,num=0;num+=knowDay(year,month)-day;for(i=month+1;i<=12;i++){num+=knowDay(year,i);}for(i=1;i<=17;i++){if(judgeLoopYear(year+i))num+=366;elsenum+=365;}for(i=1;i<month;i++){num+=knowDay(year+18,i);}num+=day;return num;}bool no18Birthday(int year,int month,int day) //出生是閏年,18年後不是閏年,無生日{if(month==2 && day==29 && judgeLoopYear(year+18)==false)return false;return true;}int main(){int year,month,day,cas; cin>>cas;while(cas--){scanf("%d-%d-%d",&year,&month,&day);if(judgeInputCorrect(year,month,day)==false || no18Birthday(year,month,day)==false){cout<<-1<<endl;continue;}cout<<count(year,month,day)<<endl;}return 0;}