日期转化 标准模式 swust oj 78

给定一个日期,问这个星期是星期几~~

题目链接

这种问题原先一直困扰自己好久~~后来发现了标准套路,

先确定一个日期 所处的星期(作为基点),算要测试的数据距离基点的相差的日期数

以1年月1日为参考点       365*year+ (year-1)/4- (year-1)/100+(year-1)/400+月份的日期+day数+  再(1或0)  是否当年为闰年并且月月份大于2月

计算出差来,就是相差的日期数     在基点前面的套用公式     ((y-x)%7+7)%7   在基点后 (y+x)%7      0代表的是sunday    其余对应星期数  最好基点选择1年1月1日

postcode:

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
const int days=365;
const int s[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool Isleap(int y){
    if(y%400==0||y%100&&y%4==0)return 1;
    return 0;     
}
int leap(int y){
   if(!y)return 0;
   return y/4-y/100+y/400;    
}
int cal(int day,int mon,int year){
   int res=(year-1)*days+leap(year-1);  //细节 不要漏掉
   for(int i=1;i<mon;i++)
      res+=s[i];
   if(Isleap(year)&&mon>2)res++;   //加 1 是要是闰年 还要月份大于2
   res+=day;
   return res;    
}
int count_day(int da,int ma,int ya,int db,int mb,int yb){
    int resa=cal(da,ma,ya);
    int resb=cal(db,mb,yb);
    return abs(resa-resb);    
}




int main()
{
    int year,mon,day;
    while(scanf("%d%d%d",&year,&mon,&day)!=EOF){
        int sum=count_day(1,1,1,day,mon,year);
        int ans=(1+sum)%7;
        switch(ans){
           case 0:printf("Sunday\n");break;
           case 1:printf("Monday\n");break;
           case 2:printf("Tuesday\n");break;
           case 3:printf("Wendesday\n");break;
           case 4:printf("Thursday\n");break;
           case 5:printf("Friday\n");break;
           case 6:printf("Saturday\n");break;
        }                                          
                                                
    }
    return 0;
} 


你可能感兴趣的:(算法)