转载请注明出处
摘要:模拟 ,闰年
一. 题目翻译
1. 描述:
13号又是一个星期五。13号在星期五比在其他日子少吗?为了回答这个问题,写一个程序,要求计算每个月的十三号落在周一到周日的次数。给出N年的一个周期,要求计算1900年1月1日至1900+N-1年12月31日中十三号落在周一到周日的次数,N为正整数且不大于400.
这里有一些你要知道的:
1、1900年1月1日是星期一.
2、4,6,11和9月有30天.其他月份除了2月都有31天.闰年2月有29天,平年2月有28天.
3、年份可以被4整除的为闰年(1992=4*498 所以 1992年是闰年,但是1990年不是闰年).
4、以上规则不适合于世纪年。可以被400整除的世纪年为闰年,否则为平年。所以,1700,1800,1900和2100年是平年,而2000年是闰年.
2. 格式:
PROGRAM NAME:friday
INPUT FORMAT:
(friday.in)
一个正整数n.
OUTPUT FORMAT:
(friday.out)
七个在一行且相分开的整数,它们代表13日是星期六,星期日,星期一...星期五的次数.
SAMPLE INPUT:
20
SAMPLE OUTPUT:
36 33 34 33 35 35 34
二. 题解
1. 题意理解 :
这道题目还是比较简单,模拟即可。我的思路是根据上个月13号是周几,来推算当前月的13号是周几,公式是(上月周几 + 本月的天数)%7,并累加。
2. 需要注意的细节:
要特别注意以下两个小细节:1. 闰年的2月、大月、小月的天数不同 2.程序的起点是1900.1.1,所以代码中的上个月的13日应该是1899.12.13日,这个要计算对(也就是程序中的lastday的初始值是3的来历)。
3. 启示:
闰年的计算公式积累一下: (year)%4==0&&(
year
)%100!=0)||(
year
)%400==0。自己理解一下历法当中的闰年。
三. 代码
/*
ID: fightin1
LANG: JAVA
TASK: friday
*/
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.PrintWriter;
public class friday {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new FileReader("friday.in"));
PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter("friday.out")));
int years = Integer.parseInt(br.readLine());
int[] count = new int[7];
int lastDay = 3;
for (int i=0;i<years;i++){
for (int j=1;j<=12;j++){
if (j==5||j==7||j==10||j==12){
lastDay = (lastDay+30)%7;
} else if(j==3) {
if (((1900+i)%4==0&&(1900+i)%100!=0)||((1900+i)%400==0))
lastDay = (lastDay+29)%7;
else
lastDay = (lastDay+28)%7;
} else {
lastDay = (lastDay+31)%7;
}
count[lastDay]++;
}
}
pw.println(count[6]+" "+count[0]+" "+count[1]+" "+count[2]+" "+count[3]+" "+count[4]+" "+count[5]);
pw.close();
br.close();
}
}