编程学习笔记6--日期和时间的处理

日期和时间的处理问题也是编程比赛里面经常见到的,比如蓝桥杯里面出现过的高斯问题。日期问题无非就是值得考虑的是瑞年问题。记住四年一闰,百年不闰,四百年再闰

这个常识判断就行。

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;
}
















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值