日期计算(来自计蒜客)

1.蒜头君的生日

## 题目如下

在这里插入图片描述

注意:闰年二月有29天

法一:公式法 蔡基姆拉尔森计算公式:

W= (d+2m+3(m+1)/5+y+y/4-y/100+y/400+1)%7 ,在公式中d表示日期中的日数,m表示月份数,y表示年数。

注意:在公式中有个与其他公式不同的地方:

把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。

法二:直接写

代码如下:

#include<bits/stdc++.h>
using namespace std;
string day[7]={"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
bool isyear(int y)//判断闰年
{
    if(y%4==0&&y%100!=0||y%400==0)return true;
    else return false;
}
int whichday(int y,int m,int d)
{
    /*公式法
    if(m<=2)
    {
        m+=12;
        y--;//上一年的13、14月
    }
    return (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;*/
    //数组下标减一
    
    int i,weekday=0;
    for(i=1;i<y;i++)
    {
        if(isyear(i)){
            weekday+=366;
            weekday%=7;
        }
        else{
            weekday+=365;
            weekday%=7;
        }
    }
    for(i=1;i<m;i++){
        if(i==1||i==3||i==5||i==7||i==8||i==10||i==12){
            weekday+=31;
            weekday%=7;
        }
        if(i==4||i==6||i==9||i==11){
            weekday+=30;
            weekday%=7;
        }
        if(i==2){
            if(isyear(y)){
                weekday+=29;
                weekday%=7;
            }
            else{
                weekday+=28;
                weekday%=7;
            }
        }
    }
    weekday+=d-1;
    weekday%=7;
    return weekday;
}
int main()
{
    int y,m,d;
    cin>>y>>m>>d;
    cout<<day[whichday(y,m,d)]<<endl;
    return 0;
}

恋爱纪念日

蒜头君和花椰妹谈恋爱啦。祝福他们吧。蒜头君想知道他们的第 100天,200天 … 纪念日。

输入格式

输入 4个整数 y,m,d,k,表示他们在一起的日期,保证是一个 1900 年 1 月 1 日以后的日期,蒜头君想知道他们的 k(0≤k≤10000)天纪念日。

输出格式

输出格式按照yyyy-mm-dd的格式输出 kk天纪念日的日期。月份和天数必须各输出 2 位。保证最后答案年份不超过 4位。

样例输入1

2016 10 1 100

样例输出1

2017-01-09

样例输入2

2017 1 1 10

样例输出2

2017-01-11

格式化输出:printf("%d-%02d-%02d",y,m,d);%02d表示数字不够两位在前补0;

代码如下:

#include<bits/stdc++.h>
using namespace std;
int mon_day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//补0保证下标与月份对应
bool isyear(int y)
{
    if(y%4==0&&y%100!=0||y%400==0)return true;
    else return false;
}
int main()
{
    int y,m,d,k;
    cin>>y>>m>>d>>k;
    for(int i=1;i<=k;i++)
    {
        if(isyear(y)){
            mon_day[2]=29;
        }
        else mon_day[2]=28;
        d++;
        if(d>mon_day[m]){
            m++;
            d=1;
        }
        if(m>12){
            y++;
            m=1;
        }
    }
    printf("%4d-%02d-%02d",y,m,d);
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值