给一个日期计算星期几(蔡勒公式和朴素做法)
(1)第一种方法就是往后推,先计算出两个日期差的天数,然后对7取余。
(2)蔡勒公式。
公式 : w= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7 (w代表星期几)
w对7取余得:0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,5-星期五,6-星期六
注意:蔡勒公式只适合于1582年(中国明朝万历十年)10月15日之后的情形。
当年的1,2月要当成上一年的13,14月进行计算。
题目:
Description
acm的iphxer经常忘记某天是星期几,但是他记那天的具体日期,他希望你能写个程序帮帮他。
Input
每行有三个整数 year,month,day,日期在1600年1月1日到9600年1月1日之间。
Output
输出对应的星期,用一个整数表示;(星期一到星期六用1-6表示,星期日用0表示)
Sample Input
2011 3 6 1949 10 1 2011 4 1 1945 8 15Sample Output
0 6 5 3
第一种方法代码实现:
#include
#include
using namespace std;
int d[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}};int a[7]={6,0,1,2,3,4,5};
int leap(int year)
{if((year%4==0&&year%100!=0)||year%400==0)return 1;else return 0;
}
int leap1(int year)
{if((year%4==0&&year%100!=0)||year%400==0)return 366;else return 365;
}
int main()
{int year,month,day,n,k,day2,day1,month1,year1;while(~scanf("%d%d%d",&year,&month,&day)){ int year1=1600,month1=1,day1=1;int m=year;day2=0;while(year>year1){day2=day2+leap1(year-1);year--;}while(month>1){day2=day2+d[leap(m)][month-1];month--;}day2=day2+day-1;printf("%d\n",a[day2%7]);}return 0;
}
由于是多组测试数据可能会导致超时。
第二种方法更为省时。
第二种方法代码实现:
#include
using namespace std;
int main(){int y,m,d,w;while(~scanf("%d%d%d",&y,&m,&d)){if(m==1||m==2){m+=12;y--;//一月二月当成上年的13,14月算 }w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7;printf("%d\n",w);}
}
需注意的是当年的一月和二月要当成上年的13,14月计算。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
