1

该问题要求计算一周中每一天的第 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 天等,并将其添加到该位置。但它给出了错误的答案。

我的逻辑有什么问题。

我被困在这个简单的问题上感到非常沮丧。非常感谢所有帮助。

谢谢你!

4

2 回答 2

3

明白了!

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 月的代码,你需要做两件事情。首先,增加星期六的计数,然后由于 Jan 有 31 天,您循环查找 2 月的第 13 天,即您在同一段代码中从 1900 年 1 月 13 日移动到 1900 年 2 月 13 日,这通过添加 31 天来完成这是 2 月 13 日到 1 月 13 日之间的天数。要将其转换为一天,请执行 31%7(在您的情况下为 +1,因为您的编号从 1 开始)。因此,在月份 = 一月的循环中,二月也会增加。

对于月份 = 2 月,您循环查找 3 月的日期,并在 for 循环关闭时递增。类似地,在循环 month = Nov 中,您循环查找 12 月的日期,然后如果该年是最后一年则中断,以免溢出到下一年。如果那一年不是最后的你进入

 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 + " ");

    }
}
}
于 2013-03-31T04:44:30.430 回答
0

正如评论中所指出的,您将迭代 11 个月。在您发布后我尝试了这个问题,以了解我是否遗漏了什么。除此之外它看起来还可以。让我们知道 12 个月是否可以解决问题。否则,我会尝试更多地研究您的代码。

我提到的代码的剧透警报。

 HashMap<Integer, Integer> daysInAMonth = new HashMap<Integer, Integer>();
    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<Integer, Integer> dayFrequency = new HashMap<Integer, Integer>(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<N; i++) {
        int year = 1900+i;

        for(int month=0; month<12;month++){

            if(month ==0 && year ==1900) {
                int prevCount  = dayFrequency.get(0);
                dayFrequency.put(0, prevCount + 1);
                lastFriday = 0;
            }


            int noOfdays;
            if(month != 1)
                noOfdays = daysInAMonth.get(month);
                else
                    noOfdays = daysInFebruary(year);

            int wrapDays = (noOfdays-13) + 13;

            lastFriday = (lastFriday + wrapDays)%7;

            dayFrequency.put(lastFriday, dayFrequency.get(lastFriday) + 1);

        }           
    }

    dayFrequency.put(lastFriday, dayFrequency.get(lastFriday) - 1);     


    for(int i=0;i<7;i++) {
        out.print(dayFrequency.get(i));
        if( i != 6)
            out.print(" ");
    }
    out.println("");
    out.close();
    System.exit(0);  
}
public static int daysInFebruary(int year) {
    if(year % 400 == 0)
        return 29;
    if(year % 4 == 0 && year % 100 != 0)
        return 29;
    return 28;      
}   
}
于 2013-03-31T04:05:33.567 回答