2691 - 日历

通过次数

0

提交次数

0

时间限制 : 2 秒 内存限制 : 128 MB

给定一个天数,输出经过这么多天后的一个时间。

闰年是可以被4整除但是不能被100整除,或者可以被400整除的。

题目输入

每组数据包括一个正整数n, 初始日期为2000年1月1号. 最后一行包括一个整数-1, 假设年份不超过9999

题目输出

对于每组数据, 输出个数为: "YYYY-MM-DD DayOfWeek", "DayOfWeek" 是 "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" and "Saturday".中的一个

输入/输出样例

输入格式

1730
1740
1750
1751
-1

输出格式

2004-09-26 Sunday
2004-10-06 Wednesday
2004-10-16 Saturday
2004-10-17 Sunday

C语言解答

#include "stdio.h"
int n,year,month,day;

int count_year(int x)
{
	if ((((year%4)==0)&&(year%100!=0))||(year%400==0)) return (366);
	else return (365);
}

int count_month(int x,int y)
{
	int t;
	 switch (month)
      {
          case 1 :
          case 3 :
          case 5 :
          case 7 :
          case 8 :
          case 10 :
          case 12 : t=31;break;
          case 2 :
        	  {
            	  t=28;
                  if ((((y%4)==0)&&(y%100!=0))||(y%400==0)) t=29;
               	  break;
        	  }
           default :t=30;
      }
	 return(t);
}

void work()
{
	int sum=n;
	year=2000;
	month=1;
	day=1;
	while (n>364)
	{
		if (n<count_year(year)) break;
		n=n-count_year(year);
		year++;
	}
	while (n>28)
	{
		if (n<count_month(month,year)) break;
		n=n-count_month(month,year);
		month++;
	}
	day=day+n;
	printf("%d-",year);
	if (month<10) printf("0");
	printf("%d-",month);
	if (day<10) printf("0");
	printf("%d ",day);
	switch(sum-(sum/7)*7)
	{
		case 0:printf("Saturday\n");break;
	    case 1:printf("Sunday\n");break;
		case 2:printf("Monday\n");break;
		case 3:printf("Tuesday\n");break;
		case 4:printf("Wednesday\n");break;
		case 5:printf("Thursday\n");break;
		case 6:printf("Friday\n");break;
	}


}

void main()
{

	while (1)
	{	
		scanf("%d",&n);
		if (n==-1) break;
    	work();
		
	}
}

C++解答

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <map>
#include <queue>
#include <stack>
#include <iostream>
using namespace std;

int leapyear(int year)
{
	if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
		return 1;
	return 0;
}

int monthofday(int month, int year)
{
	if(month == 2)
	{
		if(leapyear(year) == 1)
			return 29;
		else
			return 28;
	}
	if(month % 2 == 0)
	{
		if(month <= 7)
			return 30;
		else
			return 31;
	}
	else
	{
		if(month > 7)
			return 30;
		else
			return 31;
	}
}

int main ()
{
	//freopen("A.in", "r", stdin);
	//freopen("A.out", "w", stdout);
	int n, m, i, j, k, len;
	int leap[2] = {365,366};
	char DayOfWeek[7][10] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
	while(scanf("%d",&n) && n != -1)
	{
		int nn = n;
		int y = 2000, m = 1, d = 1;
		while(n >= leap[leapyear(y)])
		{
			n -= leap[leapyear(y)];
			y ++;
		}

		for(m = 1 ; m <= 12 ; m ++)
		{
			if(n >= monthofday(m,y))
				n -= monthofday(m,y);
			else
				break;
		}

		for(d = 1 ; d < monthofday(m,y); d ++)
		{
			if(n > 0)
				n --;
			else
				break;
		}
		int mm = m /10;
		int dd = d / 10;

		printf("%d-%d%d-%d%d %s\n",y,mm,m%10,dd,d%10,DayOfWeek[(6+nn%7)%7]);
	}
	return 0;
}