2013-02-26 40 views
0

我的代碼有什麼問題?出於某種原因,我繼續讓這一天休息一天?例如,今天是2013年的第26個星期二,但該計劃告訴我這是一個星期三。我正在使用Zeller的同餘算法。我的代碼有什麼問題? Zeller的同餘算法代碼

import javax.swing.JOptionPane; 
public class zeller { 
    public static void main(String[] args) { 
     String yearString = JOptionPane.showInputDialog("Enter the year:"); 

     int year = Integer.parseInt(yearString); 

     String monthString = JOptionPane.showInputDialog("Enter the month (3-12)(January and Feburary are 13 and 14):"); 
     int month = Integer.parseInt(monthString); 

     String dayString = JOptionPane.showInputDialog("Enter the day 1-31: "); 
     int day = Integer.parseInt(dayString); 

     switch (month) { 
      case 13: monthString = "January"; 
       break; 
      case 14: monthString = "February"; 
       break; 
      case 3: monthString = "March"; 
       break; 
      case 4: monthString = "April"; 
       break; 
      case 5: monthString = "May"; 
       break; 
      case 6: monthString = "June"; 
       break; 
      case 7: monthString = "July"; 
       break; 
      case 8: monthString = "August"; 
       break; 
      case 9: monthString = "September"; 
       break; 
      case 10: monthString = "October"; 
       break; 
      case 11: monthString = "November"; 
       break; 
      case 12: monthString = "December"; 
       break; 
      default: monthString = "Invalid month"; 
       break; 
     } 

     int j = year/100; 
     int k = year % 100 ; 
     double h = (day + ((26*(month + 1))/10) + k + (k/4) +(j/4) + (5 * j)) % 7; 
     int h1 = (int)h; 

     switch (h1) { 
      case 0: dayString = "Saturday"; 
       break; 
      case 1: dayString = "Sunday"; 
       break; 
      case 2: dayString = "Monday"; 
       break; 
      case 3: dayString = "Tuesday"; 
       break; 
      case 4: dayString = "Wednesday"; 
       break; 
      case 5: dayString = "Thursday"; 
       break; 
      case 6: dayString = "Friday"; 
       break; 

      default: monthString = "Invalid month"; 
       break; 
     } 

     System.out.println("Day of the week is: " + dayString); 
    } 
} 

回答

1

如果是1月或2月,需要修改年份。說明在維基百科:

人們很容易看到,在某一年,3月1日(如果這是一個 週六,那麼3月2日)是一個很好的測試日期;並且在給定的 世紀中,最好的測試年份是100的倍數.Zeller 使用了十進制算術,並且發現使用J和K代表年份中的 是方便的。但在使用計算機時,它是簡單 處理改性Y年,這是Ÿ - 1一月 二月:

我修改您的代碼如下所示,它的工作原理:

import javax.swing.JOptionPane; 

public class zeller { 
    public static void main(final String[] args) { 

     String yearString = JOptionPane.showInputDialog("Enter the year:"); 

     int year = Integer.parseInt(yearString); 

     String monthString = 
      JOptionPane.showInputDialog("Enter the month (3-12)(January and Feburary are 13 and 14):"); 
     int month = Integer.parseInt(monthString); 

     String dayString = JOptionPane.showInputDialog("Enter the day 1-31: "); 
     int day = Integer.parseInt(dayString); 

     switch (month) { 
     case 14: 
      year--; 
      monthString = "January"; 
      break; 
     case 13: 
      year--; 
      monthString = "February"; 
      break; 
     case 3: 
      monthString = "March"; 
      break; 
     case 4: 
      monthString = "April"; 
      break; 
     case 5: 
      monthString = "May"; 
      break; 
     case 6: 
      monthString = "June"; 
      break; 
     case 7: 
      monthString = "July"; 
      break; 
     case 8: 
      monthString = "August"; 
      break; 
     case 9: 
      monthString = "September"; 
      break; 
     case 10: 
      monthString = "October"; 
      break; 
     case 11: 
      monthString = "November"; 
      break; 
     case 12: 
      monthString = "December"; 
      break; 
     default: 
      monthString = "Invalid month"; 
      break; 
     } 
     int j = year/100; 
     int k = year % 100; 
     double h = (day + ((13 * (month + 1)/5)) + k + (k/4) + (j/4) + (5 * j)) % 7; 
     int h1 = (int) h; 
     switch (h1) { 
     case 0: 
      dayString = "Saturday"; 
      break; 
     case 1: 
      dayString = "Sunday"; 
      break; 
     case 2: 
      dayString = "Monday"; 
      break; 
     case 3: 
      dayString = "Tuesday"; 
      break; 
     case 4: 
      dayString = "Wednesday"; 
      break; 
     case 5: 
      dayString = "Thursday"; 
      break; 
     case 6: 
      dayString = "Friday"; 
      break; 

     default: 
      monthString = "Invalid month"; 
      break; 
     } 

     System.out.println("Day of the week is: " + dayString); 

    } 
} 
+0

謝謝啊應該檢查維基但感謝! – Aniki 2013-02-26 19:17:47

0

維基百科,

在這個算法一月和二月算作月13和前一年的14。例如。如果是2010年2月2日,算法會將該日期計爲2009年第14個月的第二天(2009年2月14日,格式爲DD/MM/YYYY格式)。

所以在技術上你的代碼沒有錯; 2013年12月26日(今天)作爲2013年第14個月的第26天實際上是計算星期幾02/26/。

2
  1. 的月 - 2月算作13和14個月的前一年,所以 如果你想用戶輸入的1或2的實際月份爲一月或二月,你可以這樣添加代碼:
if (month == 1){ 
    month = 13; 
    year -=1; 
} 
else if (month == 2) { 
    month = 14; 
    year -=1; 
}