0

我盯着我的 Zeller's Congruence 程序看了一个小时,但我不知道我的逻辑错误在哪里。有人可以指出错误吗?谢谢!

// Implement the Zeller's congruence algorithm.
// To calculate the day of the week

import java.util.Scanner;

public class DayOfTheWeek {
    public static void main(String[] args) {
        // Create a Scanner
        Scanner input = new Scanner(System.in);

        // Prompt the user to enter a year, month and a day
        System.out.print("Enter year (e.g., 2008): ");
        int year = input.nextInt();

        System.out.print("Enter month: 1-12: ");
        int month = input.nextInt();

        System.out.print("Enter the day of the month: 1-31: ");
        int day = input.nextInt();

        // Check if the month is January or February
        // If the month is January and February, convert to 13, and 14,
        // and year has to -1. (Go to previous year).
        if (month == 1 || month == 2) {
            month += 12;
            year--;
        }

        // Compute the answer
        int k = year % 7; // The year of the century
        int j = (int)(year / 100.0); // the century
        int q = day;
        int m = month;
        int h = (q + (int)((26 * (m + 1)) / 10.0) + k + (int)(k / 4.0) 
                + (int)(j / 4.0) + (5 * j)) % 7;

        String result = "Day of the week is ";

        //Display the name of the day of the week
        if (h == 0) 
            System.out.print(result + "Saturday");
        else if (h == 1)
            System.out.print(result + "Sunday");
        else if (h == 2)
            System.out.print(result + "Monday");
        else if (h == 3)
            System.out.print(result + "Tuesday");
        else if (h == 4)
            System.out.print(result + "Wednesday");
        else if (h == 5)
            System.out.print(result + "Thursday");
        else
            System.out.print(result + "Friday");
    }
}
4

3 回答 3

2
int k = year % 7; // The year of the century

你可能想要% 100那里。

此外,您正在混合两个公式。如果您追求软件中的最佳实现(由 Wikipedia 提供),请尝试以下操作:

// ...
// remove j and k
int y = year;
// ...
// reformatted for readability
int h = (q +
         (int)((26 * (m + 1)) / 10.0) +
         y +
         (int)(y / 4.0) +
//       changes after here
         6 * (int)(y / 100.0) +
         (int)(y / 400.0))
        % 7;

或这个:

int h = (q + (int)((13 * (m + 1)) / 5.0) + k + (int)(k / 4.0)
//                  ^^
           + (int)(j / 4.0) + (5 * j)) % 7;

您(可能无意中)将第二个软件公式的开头与第一个软件公式的结尾一起使用,导致计算机无休止的混乱。

于 2013-06-30T13:40:03.690 回答
1

int k = year % 7; // The year of the century

这不应该% 100吗?

于 2013-06-30T13:37:30.857 回答
1
int h = (q + (int)((13 * (m + 1)) / 5.0) + k + (int)(k / 4.0)
//                  ^^
       + (int)(j / 4.0) + (5 * j)) % 7;

并不总是给出相同的结果

int h = (q + (int)((26 * (m + 1)) / 10.0) + k + (int)(k / 4.0)
//                  ^^
       + (int)(j / 4.0) + (5 * j)) % 7;

但我感谢并使用您的意见,谢谢!

我也发现这很有帮助:

//输出原始年份输入 (k<10?("0" + k):(k)),同样格式为月份和日期:mm/dd/yyyy;

String result = "The Day of the week of " + (i<10?("0" + i):(i)) + "/" 
//
+ (q<10?("0" + q):(q)) + "/" + j + (k<10?("0" + k):(k)) + " is ";
于 2015-09-15T03:55:24.397 回答