给定一个时间计算它是星期几
题目中给的是2011.11.11是星期五,后来我在网上看教程的时候,有提到2011.1.1是周六,那我们就先按周六来算
//
// 日期计算.cpp
// Lanqiao
//
// Created by 刘嘉敏 on 2018/3/24.
// Copyright © 2018年 JiaminLiu. All rights reserved.
//
#include <stdio.h>
#include <iostream>
#include <cmath>
#include <string>
#include <algorithm>
using namespace std;
typedef long long ll;
bool leap(int y){
if(y % 4 == 0 && y % 100 != 0) return true;
if(y % 400 == 0) return true;
return false;
}
ll getY(int yyyy){
ll days=0;
if( yyyy<=2011 ){
while(yyyy!=2011){
if(leap(yyyy)) days += 366;
else days+=365;
yyyy++;
}
}
else {
for(int i=2011;i<yyyy;i++){
if(leap(i)) days+=366;
else days+=365;
}
}
return days;
}
int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int getM(int yyyy,int mm,int day){
int sum = 0;
if(leap(yyyy)) month[2] = 29;
for(int i=1;i<mm;i++)
{
sum+=month[i];
}
sum=sum+day-1;
return sum;
}
int main(){
int yyyy,mm,dd;
cin >> yyyy >> mm >> dd;
ll sum = getY(yyyy);
// cout<<sum<<endl;
int w;
if(yyyy<2011){
sum = sum - getM(yyyy,mm,dd);
// cout<<sum<<endl;
w = ((sum % 7) == 6) ? 7 : 6 - (sum % 7);
cout << w << endl;
}
else{
sum = sum + getM(yyyy,mm,dd);
w = (6 + (sum % 7) )>7 ? ((6 + (sum % 7))%7) : (6 + (sum % 7));
cout << w << endl;
}
return 0;
}
这道题开始一直拿不了满分,后来发现是在一个if-else出现了问题,即是else中包括了year为2011的情况,所以说还是要细心。
在网上还看到了一个计算星期的公式,
基姆拉尔森计算公式:
W= (d+2m+3(m+1)/5+y+y/4-y/100+y/400+1)%7
(需要使用switch...case语句判断星期几)
改进:
W= (d+2m+3(m+1)/5+y+y/4-y/100+y/400)%7+1
(计算出的结果直接是对应的星期几)
注意:
当month=1或2时,需要将其改为month+12并且year-1
他是这样写的,不过我还没试过,先放上链接吧https://www.cnblogs.com/maxin/p/5806615.html