华为笔试 5.13 C++ 附代码
第一题:
给一个日期,并告诉你是周几;
然后再给你一个日期,请你判断这是周几。
AC,难点主要在闰年的判断,一开始我没有考虑世纪闰年的情况。还有一点是,用例可能给出的日期是 第一个日期在第二个日期之后,这种情况也得考虑。还有就是这种输入格式,之前接触的少,不太习惯。
#include <iostream> #include <vector> #include <functional> #include <algorithm> #include <limits> #include <string> #include <queue> #include <unordered_map> #include <iomanip> using namespace std; // 判断闰年 bool runnian(int y){ if(y%100==0 && y%400 == 0) return true; if(y%4 == 0 && y%100 != 0) return true; return false; } int main(){ // 输入格式:1980 01 02 5 | 1980 01 04 // 题目:1980 01 02 周五,求1980 01 04周几 vector<int> fir(3); //存储第一个日期 vector<int> sec(3); //存储第二个日期 char temp; int wd; //存储第一个日期是周几 for(int i=0;i<3;i++){ cin>>fir[i]; } cin>>wd; cin>>temp; for(int i=0;i<3;i++){ cin>>sec[i]; } // 处理fir日期在sec之后的情况,swap(fir,sec) bool swapflag = false; if(fir[0]>sec[0]) swapflag = true; if(fir[0] == sec[0] && fir[1]>sec[1]) swapflag = true; if(fir[0] == sec[0] && fir[1]==sec[1] && fir[2]>sec[2]) swapflag = true; vector<int> tmpvec; if(swapflag){ tmpvec= fir; fir = sec; sec = tmpvec; } // 初始化每个月的天数 vector<int> monthdays={0,31,28,31,30,31,30,31,31,30,31,30,31}; int days = 0;// 两个日期相差天数 // 先处理不属于fir和sec的年份天数 for(int i=fir[0]+1;i<sec[0];i++){ days += runnian(i)?366:365; } // 判断闰年 bool firflag = runnian(fir[0]); bool secflag = runnian(sec[0]); // fir和sec在同一年 if(fir[0]==sec[0]){ if(fir[1]==sec[1]){//fir和sec在同一个月 days += sec[2]-fir[2]; } else{ days += monthdays[fir[1]] - fir[2]; for(int i=fir[1]+1;i<sec[1];i++){ days += monthdays[i]; } days += sec[2]; if(firflag && fir[1]<=2 && sec[1]>2) days+=1; //处理闰年 } } // fir和sec不在同一年 else{ days += monthdays[fir[1]] - fir[2]; for(int i=fir[1]+1;i<=12;i++){ days+=monthdays[i]; } for(int i=1;i<sec[1];i++){ days+=monthdays[i]; } days += sec[2]; if(firflag && fir[1]<=2) days+=1;//处理闰年 if(secflag && sec[1]>2) days+=1; } // 知道了相差天数,求周几 int ans = 0; if(swapflag) ans = (wd-(days%7)+7)%7; //fir日期在sec之后 else ans = ((days%7)+wd)%7; //fir日期在sec之前 if(ans==0) ans=7; cout<<ans<<endl; return 0; }#华为2020春招##华为##笔试题目#