OpenJudge NOI 1.13 02:不吉利日期

【题目链接】

OpenJudge NOI 1.13 02:不吉利日期

【题目考点】

1. 取模运算

【解题思路】

在以下描述中,星期的数值为0表示星期日,1表示星期一,…,6表示星期六。
考虑这一年第x天是星期几。
假如1月1日是星期w,这一年第0天为星期w-1。星期编号每过7天为一个周期,第0天,第7天,…,第7的倍数天的星期都是一样的,都是w-1。
如果 x / 7 = m . . . . . . d x/7 = m ...... d x/7=m......d,那么 x = 7 ∗ m + d x = 7*m+d x=7m+d 0 ≤ d < 7 0 \le d < 7 0d<7,第x天的星期为星期w-1再向后数d天。
如果 w − 1 + d w-1+d w1+d为7,那么该值应该变为0,表示星期日。
如果 w − 1 + d w-1+d w1+d为8,那么该值应该变为1,表示星期一。
因此第x天的星期为 ( w − 1 + d ) % 7 (w-1+d)\%7 (w1+d)%7
在括号里加上7的倍数后,结果不会改变, ( w − 1 + d ) % 7 = ( w − 1 + 7 ∗ m + d ) % 7 = ( w − 1 + x ) % 7 (w-1+d)\%7=(w-1+7*m+d)\%7 = (w-1+x)\%7 (w1+d)%7=(w1+7m+d)%7=(w1+x)%7
因此这一年第x天是星期 ( x + w − 1 ) % 7 (x+w-1)\%7 (x+w1)%7
先初始化每个月份的天数。从1月13日开始,每次加上当前月份的天数,得到每个月13日是这一年的第几天。通过上式求出该日的星期,看是不是星期五,如果是则输出。

【题解代码】

解法1:
#include <bits/stdc++.h>
using namespace std;
int mon[13];//mon[i]:第i个月的天数
void initMon()//初始化每个月的天数 
{
    for(int i = 1; i <= 12; i++)
    {
        if(i == 2)
            mon[i] = 28;
        else if(i == 4 || i == 6 || i == 9 || i == 11)
            mon[i] = 30;
        else
            mon[i] = 31;
    } 
}
int main()
{
    initMon();
    int w, x = 13, a;//x:1月13日是这一年的第13天 
    cin >> w;
    for(int i = 1; i <= 12; ++i)
    {
        if((x+w-1)%7 == 5)//(x+w-1)%7:一年第x天的星期,星期日为0
            cout << i << endl;
        x += mon[i];//加上mon[i]后,x为第i+1月13日是这一年的第几天 
    }
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值