gpt4 book ai didi

java - 美国 : friday the thirteen what's wrong with my logic?

转载 作者:行者123 更新时间:2023-11-29 05:46:19 29 4
gpt4 key购买 nike

该问题要求计算一周中每一天的第 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; month<=12;month++){
if((i==1900)&&(month==1)) counter[position-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==8)||(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+" ");

}}

我真的很困惑,因为我的逻辑给出了错误的答案。我所做的是增加天数,即 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 开始)。因此,在 month = January 的循环中,您也增加了 Feb。

对于 month = Feb,您循环查找 March 的日期并在 for 循环结束时递增。类似地,在循环 month = Nov 中,您循环查找 Decemeber 的日期,然后如果该年是最后一年则中断,以免溢出到下一年。如果这一年不是最后一年,您将进入

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

并在不中断的情况下完成 12 月的常规业务和增量。对于 month = December,您增加次年 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 + " ");

}
}
}

关于java - 美国 : friday the thirteen what's wrong with my logic?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15726140/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com