题目
有些西方人比较迷信,如果某个月的13号正好是星期五,他们就会觉得不太吉利,用古人的说法,就是“诸事不宜”。请你编写一个程序,统计出在某个特定的年份中,出现了多少次既是13号又是星期五的情形,以帮助你的迷信朋友解决难题。
说明:(1)一年有365天,闰年有366天,所谓闰年,即能被4整除且不能被100整除的年份,或是既能被100整除也能被400整除的年份;(2)已知1998年1月1日是星期四,用户输入的年份肯定大于或等于1998年。
代码
#include<stdio.h>
int runyear(int a) //判断闰年
{
if(a%4==0 && a%100 != 0 || a%100 == 0 && a%400 == 0){
return 1;
}else return 0;
}
int tianshu(int year) //计算该年之前过了多少天
{
int sum=0;
while(year-1 != 1997){
if(runyear(year-1) == 1){
sum+=366;
}else
{
sum+=365;
}
year--;
}
return sum;
}
int blank(int year,int day)//年份,星期几
{
int sum=0,cnt=0;
if(runyear(year) == 1){
sum+=366;
}else sum+=365;
int i;
for(i=1;i<=12;i++){
if(i==1||i==3||i==5||i==7||i==8||i==10||i==12){
//当月份为31天时
day=(day+12)%7;
if(day == 5){
cnt++;
}
day=(day+19)%7; //下一个月的一号星期
}else if(i==2&&runyear(year)==1){
//当月份为2且闰年时
day=(day+12)%7;
if(day == 5){
cnt++;
}
day=(day+17)%7; //下一个月的一号星期
}else if(i==2&&runyear(year)!=1){
//当月份为2且不是闰年时
day=(day+12)%7;
if(day == 5){
cnt++;
}
day=(day+16)%7; //下一个月的一号星期
}else{
//当月份为30天时
day=(day+12)%7;
if(day == 5){
cnt++;
}
day=(day+18)%7; //下一个月的一号星期
}
}
return cnt;
}
int main()
{
int day,t,cnt,year;
scanf("%d",&year);
day=tianshu(year);
// printf("%d\n",day);
t=4;
// t=t+day;
t=(t+day)%7;
if(t == 0){
t=7;
}
// printf("%d\n",t);
cnt=blank(year,t);
printf("%d",cnt);
return 0;
}