ADV-127-日期计算

问题描述
  已知2011年11月11日是星期五,问YYYY年MM月DD日是星期几?注意考虑闰年的情况。尤其是逢百年不闰,逢400年闰的情况。
输入格式
  输入只有一行
  YYYY MM DD
输出格式
  输出只有一行
  W
数据规模和约定
  1599 <= YYYY <= 2999
  1 <= MM <= 12
  1 <= DD <= 31,且确保测试样例中YYYY年MM月DD日是一个合理日期
  1 <= W <= 7,分别代表周一到周日
样例输入
2011 11 11
样例输出
5

//-----------C----------
#include<stdio.h>
int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

int main(void){
	int y,m,d,i,temp=0,sum=0,j,u;
	scanf("%d%d%d",&y,&m,&d);
	for(i=0;i<2011;i++){
		if((i%4==0)&&(i%100!=0)||(i%400==0))
		{
			sum++;
		}
		sum+=365;
	}sum=sum+365-50;
	for(i=0;i<y;i++){
		if((i%4==0)&&(i%100!=0)||(i%400==0))
		{
			temp++;
		}
		temp+=365;
	}
	for(j=1;j<m;j++){
		temp+=month[j];
		if(((y%4==0)&&(y%100!=0)||(y%400==0))&&(j==2))temp++;
	}temp+=d;
	if(temp>=sum){
		if((temp-sum+5)%7==0)
		printf("%d",7);
		else 
		printf("%d",(temp-sum+5)%7);
	}else{
		u=sum-temp;
		if(u<=5){
			printf("%d",!(5-u)%7?7:(5-u)%7);
		}else{
			printf("%d",7-(u-5)%7?7-(u-5)%7:7);
		}
	}
	return 0;
}



//----------C++---------------
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
bool Is(int y){
    if(y%400==0) return 1;
    if(y%100==0) return 0;
    if(y%4==0) return 1;
    return 0;
}
int Month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
struct date{
    int yyyy,mm,dd;
    date(int y=0,int m=0,int d=0){
        yyyy=y;
        mm=m;
        dd=d;
    }
    bool operator < (const date &rhs) const{
        if(yyyy!=rhs.yyyy) return yyyy<rhs.yyyy;
        if(mm!=rhs.mm) return mm<rhs.mm;
        return dd<rhs.dd;
    }
    bool operator == (const date &rhs) const{
        return (!((*this)<rhs) && !(rhs<(*this)));
    }
    int operator - (const date &rhs) const{
        int ret=0;
        date t=rhs;
        while(!(t==(*this))){
        //        cout<<t.yyyy<<'-'<<t.mm<<'-'<<t.dd<<' ';
            ret++;
            t.dd++;
            if(t.dd==(t.mm==2 ? Month[t.mm]+Is(t.yyyy) : Month[t.mm])+1){
                t.dd=1;
                t.mm++;
            }
            if(t.mm==13){
                t.yyyy++;
                t.mm=1;
            }
        }
        return ret;
//        if(yyyy=rhs.yyyy)
//        if(rhs.mm==2)
//            ret+=(28+Is(rhs.yyyy)-rhs.dd);
//        else ret+=(Month[rhs.mm]-rhs.dd);
//        for(int i=rhs.mm+1;i<=12;i++)
//            if(i==2)    ret+=Month[i]+Is(rhs.yyyy);
//            else ret+=Month[i];
//        for(int i=rhs.yyyy+1;i<yyyy;i++)
//            ret+=365+Is(i);
//        for(int i=1;i<mm;i++)
//            if(i==2)    ret+=Month[i]+Is(yyyy);
//            else ret+=Month[i];
//        ret+=dd;
//        return ret;
    }
};
int main(){
    date n,st(2011,11,11);
    while(cin>>n.yyyy>>n.mm>>n.dd){
        int t=0;
        if(n<st)
            t=-(st-n);
        else
            t=n-st;
  //          cout<<t<<endl;
        t=((t%7)+7)%7;
        int ans=(t+t);
        cout<<((5+t+6)%7+1)<<endl;
    }

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值