华为笔试 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春招##华为##笔试题目#
360集团公司福利 406人发布