当前位置: 首页 > 面试题库 >

usaco:星期五13点我的逻辑出了什么问题?

景俊拔
2023-03-14
问题内容

该问题要求计算一周中每一天发生的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月的代码,就需要两件事情。首先,计算周六的增量计数,然后由于一月有31天,因此您可以循环查找2月的第13天,即您以相同的代码从1900年1月13日移至1900年2月13日,方法是增加31天这是2月13日至1月13日之间的天数。要将其转换为一天,请执行31%7(在您的情况下为+1,因为您的编号从1开始)。因此,在月=一月的循环中,二月也将增加。

对于month = Feb,您循环查找三月的日期,并在for循环关闭时增加。同样,在循环月份=
11月中,您循环查找以查找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 + " ");

    }
}
}


 类似资料:
  • 我有一个可搜索的术语数组,我想使用Lucene基本上CTRL-F通过这个文档堆栈,找到并存储所有这些术语在该文档堆栈中的位置。例如: 术语:“A”、“B”、“C” null 差不多吧。我怎么能这么做?到目前为止,我只是使用一个StandardAnalyzer,如下所示: Lucene最初会生成很多文档,但后来删除了除。cfs文件以外的所有文档。我如何保留其他文件来执行我的查询?

  • 在mergeSort函数中传递两个数组的main函数,一个原始数组和第二个临时数组,用于在其中存储排序值。 当我在合并排序后在主函数中打印 temp 时,我得到的输出为 temp = [3 2 6 4 7 8 5 8 1]。 我在 mergeSort 函数中传递了两个数组。一个是原始的,它是,第二个是在其中存储排序元素的临时数组。

  • 比较 数字 计算 间隔 否则 与 或 开关 计数器 保持 延时 平均 今天日期 现在时间 波形 序列 随机数 映射 过滤 函数 计算+ 比较+ 阀门

  • 我将在秋季开始一个计算机科学项目,我正试图在开始前建立我的编程能力。 我正在研究麻省理工学院OCW 6.0的问题,第一个是产生第1000个素数。显然,我想生成自己的代码,所以我想知道我的逻辑出了哪里问题。 你们太棒了,所以我不会在这里解释每一行,但我的逻辑要点是,我希望这个循环从n开始。如果 n 是质数,则将其添加到列表中,并将 1 添加到计数器中,如果没有,请转到下一个数字。最后,打印列表,以第

  • 我在这个URL上安装了一个应用程序:。servlet支持两种传递参数的方式——作为查询字符串和作为路径信息(例如和)。它的设计目的是对位于服务器上的引用XML文件应用默认转换,生成HTML文件,并将其发送回浏览器。有点不对劲,尽管servlet在这两种情况下都会生成html,但浏览器在第一个示例中将其呈现为html,在第二个示例中呈现为XML。此外,当我比较这两种情况下的HTTP响应(包括状态码、