UVa 602 简单模拟

题意:照着题目中的要求,对于给出的日期算该天是周几。

解法:将输入日期的总天数算出来,然后进行一些处理,我有些处理是试出来的。。。

#include<stdio.h>
#include<string.h>
char week[7][10]= {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
char mouth[12][20]= {"January","February","March","April","May","June","July","August","September","October","November","December"};
int a[13]= {0,31,28,31,30,31,30,31,31,30,31,30,31};
int m,d,y,i;
bool isOld(int m,int d,int y)  //判断是否在改革前
{
    if(y<1752||y==1752&&(m<9||m==9&&d<=2)) return true;
    return false;
}
bool isLeap(int y,bool old)   //判断是否为闰年
{
    if(isOld(m,d,y)) return ((y%4==0)?1:0);
    return ((y%4==0&&y%100||y%400==0)?1:0);
}
int day_of_mouth(int m,int d,int y)  //在某年的条件下,判断是否为闰年
{
    if(m==2) return isLeap(y,isOld(m,d,y))?29:28;
    return a[m];
}
int main()
{
    int sum;
    while(scanf("%d%d%d",&m,&d,&y)&&(m+d+y))
    {
        sum=0;
        if(y<1||m<=0||m>12||d<1||d>day_of_mouth(m,d,y)||(y==1752&&m==9&&3<=d&&d<=13))  //判断是否不符合条件
        {
            printf("%d/%d/%d is an invalid date.\n",m,d,y);
            continue;
        }
        for(i=1; i<y; i++)
            sum+=(isLeap(i,isOld(m,d,i))?366:365);
        for(i=1; i<m; i++)
            sum+=day_of_mouth(i,d,y);
        sum+=d;   //至此算出总天数
        sum%=7;   //通过模7算出星期几
        if(isOld(m,d,y)) sum=(sum+12)%7;   //我的理解是,要对在更改日期之前的日期,要把少算的12天加回来。
        else sum=(sum+1)%7;                //不加一就少一天,不知道为什么,求解释。
        printf("%s %d, %d is a %s\n",mouth[m-1],d,y,week[sum]);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值