日期和时间的处理问题也是编程比赛里面经常见到的,比如蓝桥杯里面出现过的高斯问题。日期问题无非就是值得考虑的是瑞年问题。记住四年一闰,百年不闰,四百年再闰
这个常识判断就行。
1.计算日期之间天数
下面这种办法比原来第一次见到的处理高斯日记的办法好
#include <stdio.h>
/*计算两个日期之间的天数,年按年计算,天按天计算,月按月计算*/
int main( )
{
int days[12]= {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int k,n;
int sum = 0;
int month_1, day_1,year_1,year_2,month_2, day_2;
scanf("%d-%d-%d%", &year_1,&month_1,&day_1);
scanf("%d-%d-%d",&year_2,&month_2,&day_2);
for(n=year_1;n<year_2;n++)
{
if(((n%100==0)&&n%400==0)||((n%4)==0)&&(n%100!=0))
sum+=366;
else
sum+=365;
}
for( k=month_1;k<month_2; k++)
{
sum+=days[k-1];//先把差的月份的天数计算出来
}
sum-= day_1;//最后补天数的差距
sum+= day_2;
printf("%d\n", sum);
return 0;
}
日历问题
给定从2000年1月1日(星期六)开始逝去的天数,求出这一天是哪年哪月哪日星期几。输入:输入若干行,每行一个正整数(测试样例),输入以-1结束。输出:对每个测试样例,输出一行,该行包含对应日期和星期几。格为:“YYYY-MM-DD DayofWeek ”
l
样例输入
l
1730
l
1740
l
1750
l
1751
l
-1
l
样例输出
l
2004-09-26 Sunday
l
2004-10-06 Wednesday
l
2004-10-16 Saturday
l
2004-10-17 Sunday
问题解答
此题为典型的日期处理程序,编程需要特别细心,日期处理的程序非常容易出错。
基本思路:
确定星期几:用给定的日期对7取模,余数为0~6,分别对应星期六、星期天、星期一……星期五
确定年;闰年366天,否则365天,用天数减去一年的天数,则年份加1
确定月;每个月长短不同,用剩余天数减从一月开始的天数,每减一次月份加一。
确定日。剩下的days即为最后的日期
#include <stdio.h>
int type(int );
char week[7][10]={"Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"};
int year[2]={365,366};
int month[2][12]={31,28,31,30,31,30,31,31,30,31,30,31,
31,29,31,30,31,30,31,31,30,31,30,31};
int type (int m) //闰年函数
{
if (m%4!=0 || (m%100==0&&m%400!=0))
return 0;
else
return 1;
}
int main()
{
int days, dayofweek;
int i = 0, j = 0;
while (scanf("%d", &days) && days != -1)
{
dayofweek = days % 7;
for (i = 2000; days >= year[type(i)]; i++) //i为年份
days -= year[type(i)];
for (j = 0; days >= month[ type(i) ][ j ]; j++) // j+1为月份
days-= month[ type(i) ][ j ];
printf("%d-%02d-%02d %s\n", i,j+1,days+1, week[dayofweek]);
}
return 0;
}
求年内天数
/*例如:2003年10月8日是该年的第281天。*/
#include <math.h>
#include <stdio.h>
#define lev(n) (n % 4 == 0 && (n % 100 != 0 || n % 400 == 0))
int main(void){
int y, m, d, i, s;
int month[2][13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
while (scanf("%d/%d/%d", &y, &m, &d) != EOF)
{
for (s = 0, i = 1 ; i < m ; i++)
s += month[lev(y)][i];
s += d;
printf("%d\n", s);
}
return 0;
}