我正在尝试解决以下USACO练习问题:
13日星期五真的是不寻常的事件吗?
也就是说,每月的13号在星期五降落的频率是否比一周中的其他几天少?要回答这个问题,请编写一个程序,计算在给定的N年内每月13号在星期日,星期一,星期二,星期三,星期四,星期五和星期六登陆的频率。在给定的年限内,测试时间段将从1900年1月1日到1900年12月31日+N-1。N为非负数,并且不超过400。
解决此问题之前,您需要了解的几个事实:
- 1900年1月1日是星期一。
- 三十天是九月,四月,六月和十一月,其余所有三十一天,除了二月有28天,leap年只有29天。
- 每年被4整除的年份是is年(1992 = 4 * 498,因此1992年将是>年,但1990年不是a年)
- 以上规则在数百年内不成立。被> 400整除的世纪年是leap年,其他所有年份都不是。因此,世纪1700、1800,> 1900和2100不是leap年,而2000是is年。
请勿使用计算机语言中的任何内置日期功能。
请不要只是预先计算答案。
我编写了一个似乎适用于大多数测试用例的解决方案,但是对于一个测试用例,出现以下错误:
***Error***
bash: line 1: 7854 Killed java -Xms16m -Xss16m -Xmx32m friday
这是我的代码:
import java.util.Scanner;
public class friday
{
static int day = 1;
static int month = 1;
static int year = 1900;
static int[] days = new int[7];
public static void main(String[] args) {
int num;
Scanner input = new Scanner(System.in);
num = Integer.parseInt(input.nextLine());
counter(num);
for (int i=0; i<7; i++)
{
System.out.print(days[i]+ " ");
}
}
public static void counter(int n)
{
int index=2;
days[2]=1;
while (year<1900+n)
{
day++;
index++;
if (index>6)
index=0;
if (day==29 && (year % 4!=0 ^ year % 100==0) && month==2)
incrementmonth();
if (day==31 && (month==4 || month==6 || month==9 || month==11))
incrementmonth();
if (day==32 && (month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12))
incrementmonth();
if (day==13)
days[index]++;
}
days[2]--;
}
public static void incrementmonth()
{
day=1;
month++;
if (month>12)
{
month=1;
year++;
}
}
}
我的代码适用于测试用例1和2,但是对于5的测试用例N,它输出错误而不是整数结果。预期的输出为9 9 7 9 9 8 8 9.如果有人可以帮助我弄清楚我的代码存在的问题,将不胜感激。谢谢