usaco:星期五十三我的逻辑有什么问题?

这个问题要求计算一周中每一天的第13个数字。 这是我的代码。

class CopyOffriday { public static void main(String[] args) throws IOException { BufferedReader f = new BufferedReader(new FileReader("friday.txt")); int n1=Integer.parseInt(f.readLine()); int[] counter=new int[7]; int N=1900+n1-1; int position=1; //first 13th is a Saturday for(int i=1900; i<=N;i++){ for(int month=1; month7) position%=7; counter[position-1]++; System.out.println(i+" "+month+" "+ position+" "); } } for(int x : counter){ System.out.print(x+" "); }} 

我真的很难过,因为我的逻辑给出了错误的答案。 我所做的是花费额外的天数,即31天的3天,30天的2天等,并将其添加到该位置。 但它给出了错误的答案。

我的逻辑出了什么问题。

我对这个简单的问题感到非常失望。 非常感谢所有帮助。

谢谢!

疑难杂症!

 for (int i = 1900; i <= N; i++) { for (int month = 1; month <= 12; month++) { if ((i == 1900) && (month == 1)) { counter[position - 1]++; position = 31%7 + 1; } 

有两个错误,首先应该有9个而不是8个。我们遵循的一般逻辑是我们知道1900年第一个第13天的那一天。一旦你在1900年1月的代码中,你需要做两件事情。 首先,星期六的增量计数,然后从1月开始31天,你循环找到2月的第13天,即你从1900年1月13日到1900年2月13日在同一段代码中移动,这是通过增加31天完成的这是2月13日至1月13日之间的天数。要将其转换为一天,您需要执行31%7(在您的情况下+1,因为您的编号从1开始)。 因此,在月份= 1月的循环中,您也会增加2月份。

对于月份= 2月,您循环查找3月份的日期,并在for循环结束时递增。 类似地,在循环月份= 11月,您循环查找Decemeber的日期,然后如果年份是最后一年则中断,以便不会溢出到下一年。 如果这一年不是最终你进入

  if ((month == 4) || (month == 6) || (month == 9) || (month == 11)) 

做你平时的业务并在12月增加而不会破坏。 对于月份= 12月,您将增加次年1月13日的日期计数,从而允许我们隔离1900年1月的特殊情况,因为任何其他年份的1月将跳过所有if语句并且

 position += 3; 

没有任何问题。 特殊情况 :

 if ((i == 1900) && (month == 1)) { counter[position - 1]++; position = 31%7 + 1; } 

你的完整代码。

 public static void main(String[] args) throws IOException { // Use BufferedReader rather than RandomAccessFile; it's much faster BufferedReader f = new BufferedReader(new FileReader( "/home/shaleen/USACO/friday/friday.in")); // input file name goes above PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter( "/home/shaleen/USACO/friday/friday.out"))); // Use StringTokenizer vs. readLine/split -- lots faster // StringTokenizer st = new StringTokenizer(f.readLine()); // Get line, break into tokens. int n1 = Integer.parseInt(f.readLine()); int[] counter = new int[7]; int N = 1900 + n1 - 1; int position = 1; // first 13th is a Saturday for (int i = 1900; i <= N; i++) { for (int month = 1; month <= 12; month++) { if ((i == 1900) && (month == 1)) { counter[position - 1]++; position = 31%7 + 1; } else if ((i == N) && (month == 11)) { position += 2; position %= 7; counter[position - 1]++; System.out.println(i + " " + month + " " + position + " "); break; } else if ((month == 4) || (month == 6) || (month == 9) || (month == 11)) position += 2; else if (month == 2) { if ((i % 400 == 0) || ((i % 100 != 0) && (i % 4 == 0))) position += 1; else position += 0; } else position += 3; if (position > 7) position %= 7; counter[position - 1]++; System.out.println(i + " " + month + " " + position + " "); } } for (int x : counter) { System.out.print(x + " "); } } } 

正如评论中指出的那样,您将迭代11个月。 你发布后我试过这个问题,知道我是否遗漏了什么。 除此之外它看起来还不错。 如果12个月解决问题,请告诉我们。 否则我会尝试更多地查看您的代码。

SPOILER ALERT我的推荐代码。

  HashMap daysInAMonth = new HashMap(); daysInAMonth.put(0, 31); daysInAMonth.put(2, 31); daysInAMonth.put(3, 30); daysInAMonth.put(4, 31); daysInAMonth.put(5, 30); daysInAMonth.put(6, 31); daysInAMonth.put(7, 31); daysInAMonth.put(8, 30); daysInAMonth.put(9, 31); daysInAMonth.put(10, 30); daysInAMonth.put(11, 31); HashMap dayFrequency = new HashMap(7); //sat - 0 // sun -1 // mon -2 // tue -3 // wed -4 // thu -5 // fri -6 dayFrequency.put(0, 0); dayFrequency.put(1, 0); dayFrequency.put(2, 0); dayFrequency.put(3, 0); dayFrequency.put(4, 0); dayFrequency.put(5, 0); dayFrequency.put(6, 0); int N = Integer.parseInt(st.nextToken()); if (N==0) { out.println("0 0 0 0 0 0 0"); System.exit(0); } System.out.println(N); int firstFriday = 0; int lastFriday = 0; for(int i=0 ;i