简单模拟 - Day of Week

2 篇文章 0 订阅

逻辑很简单就是,输入下面这种格式的日期字符串,输出星期几
样例输入

21 December 2012
5 January 2013

样例输出

Friday
Saturday

两种方法:

  1. 与其他的日期比较
  2. 用伟大的数学家推导的公式

第一种方法就不说了,这里说公式
这是两个公式的百科 蔡勒公式基姆拉尔森计算公式
这个博文说的很清楚 [https://www.cnblogs.com/tgycoder/p/4960487.html]
(https://www.cnblogs.com/tgycoder/p/4960487.html)

因为蔡勒公式只适用于1582年(中国明朝万历十年)10月15日之后的情形,所以我们用基姆拉尔森计算公式

#include <stdio.h>
#include <string.h>

int main(int argc, char const *argv[])
{
    char monthStr[12][10] = {
        "January", "February", "March", "April",
        "May", "June", "July", "August",
        "September", "October", "November", "December"
    };
    char weekStr[7][10] = {
        "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"
    };
    int day, year;
    char month[10];
    int i;
    int w, y, m, d;

    while (scanf("%d%s%d", &day, month, &year) != EOF)
    {
        y = year;
        for (i = 0; i < 12; i++)
        {
            if (strcmp(monthStr[i], month) == 0)
            {
                // 1月按上一年的13月来算
                if (i == 0)
                {
                    m = 13;
                    y--;
                }
                // 2月按上一年的14月来算
                else if (i == 1)
                {
                    m = 14;
                    y--;
                }
                else
                {
                    m = i + 1;
                }
                break;
            }
        }
        d = day;

        // 公式计算
        w = (d + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y /100 + y / 400) % 7;
        printf("%s\n", weekStr[w]);
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值