算法提高-日期计算

2018-03-26  本文已影响0人  嘉敏的豆子

给定一个时间计算它是星期几
题目中给的是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

上一篇 下一篇

猜你喜欢

热点阅读