0

我正在尝试解决这个涉及一些计算的非常基本的问题。但是我的计算得到了不同的结果。(它返回 6,使用示例中给出的输入,它应该返回 1(星期日)。

这是问题:

在此处输入图像描述

这就是我正在尝试的:

Scanner sc = new Scanner(System.in);

System.out.println("Enter year: (e.g., 2012): ");
int year = sc.nextInt();

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

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

//calculate the day using the forumla
int k = year % 100;
int j = year / 100;

int weekDay = (int)((day + ( 26 * (month + 1))/10.0 + k + k/4.0 + j/4.0 + (5*j)) % 7);
4

3 回答 3

4

如果您查看 Zeller 的同余性,例如在Wikipedia上,您会发现您应该使用整数进行数学运算,因为这些除法结果应该是取整的。

但是,这不是导致您的问题的问题。问题是你没有阅读m完整的描述。正如维基百科所说:

注意:在这个算法中,1 月和 2 月被算作上一年的第 13 和 14 个月。例如,如果是 2010 年 2 月 2 日,则算法将日期计算为 2009 年第 14 个月的第二天(DD/MM/YYYY 格式的 02/14/2009)

粗体部分也正是你的作业所说的。

于 2020-04-19T10:26:43.190 回答
1

m 是月份(3:三月,4:四月,.... 12:十二月)。一月和二月算作上一年的第 13 和 14 个月

因此,您需要添加一些检查输入的月份是一月还是二月。

Scanner sc = new Scanner(System.in);

System.out.println("Enter year: (e.g., 2012): ");
int year = sc.nextInt();

System.out.println("Enter month: 1-12: ");
int month = sc.nextInt();
if(month < 3){
    month += 12;
    year -= 1; 
}

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

//calculate the day using the forumla
int k = year % 100;
int j = year / 100;
int weekDay =  (day + (26 * (month + 1)) / 10 + k + k / 4 + j / 4 + (5 * j)) % 7;
System.out.println(weekDay);
于 2020-04-19T10:33:52.777 回答
0

正如罗纳德在评论中指出的那样,写数字4.0会导致浮点转换。改为写4(不带小数点)。将 int 转换添加到整个公式只会在计算完所有内容后最后转换回 int,但是您希望在整个计算过程中进行整数除法以使该公式起作用。

Andreas 也正确地指出,您没有仔细阅读算法的全部描述。

于 2020-04-19T10:26:31.503 回答