哈尔滨工程大学ACM预热赛-E-Mother's Day

传送门

题目描述

给你4个整数a,b,c,y,代表y年的a月的第b个星期c,输出这个日期

如果这个日期不存在,那么就是输出none

样例

4 2 7 2018
4 1 7 2018
2 5 4 2018
2 4 3 2018
2018/04/08
2018/04/01
none
2018/02/28

思路

由题目可知 1850 年 1月1日是星期二

那么我们就可以根据当前给的时间来计算与上面那个时间的差值+1然后%7来计算是星期几

这里可以设置一个数组来代表是星期几:

int weekday[7]={1,2,3,4,5,6,7};
比如11日与它自己相减加11
week[1]=2//伪码
int c;//差值
c%=7;
weekday[c]//代表是星期几

这里的话当然没有直接给出具体日期,但是具体到了月份,就可以先计算到那个月1号 的差值,然后,在根据后面的值来计算具体是多少号,

int month[13] ={0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int day=0;
for(int i=1850;i<y;i++){
    if(run(i))day+=366;
    else day+=365;
}
if(run(y))month[2]=29;
else month[2]=28;
for(int i=i=1;i<a;i++)day+=month[i];
day=(day+1)%7;
c-=1;//这里的c代表星期c在weekday数组中的位置
int x=0;//具体是多少号
if(c>=day){
    x=(b-1)*7+(c-day);
}
else {
    x=7-day+c+(b-1)*7;
}
x+=1;//这里可以想一下为什么要+1

判断条件

if(x>month[a]||x<=0)puts("none");
else printf("%04d/%02d/%02d\n",y,a,x);

emmmm,具体代码就不给出了,因为这个我也是参照大佬的代码来写的,而且上面的代码理解了就可以自己写出代码来了,上面写的是我觉得自己觉得很困惑的地方,如果有什么不足的地方,请大家指出,谢谢大家

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值