2014-09-24 52 views
5

編寫一個程序來計算復活節的日期。復活節週日是春季第一次滿月後的第一個星期日。通過19計算復活節的日期

  1. y是年份(如1800年或2001年)
  2. 鴻溝y,並呼籲其餘a: 使用由數學家卡爾·弗里德里希·高斯發明了算法在1800年。忽略商。
  3. 除以y100得到商b和餘數c
  4. 除以b4得到商d和餘數e
  5. 除以8 * b + 1325得到商。忽略其餘部分。
  6. 除以19 * a + b - d - g + 1530得到餘數h。忽略 商。
  7. c除以4得到商j和餘數k
  8. 除以a + 11 * h319得到商m。忽略其餘部分。
  9. 2 * e + 2 * j - k - h + m + 32除以7得到餘數r。忽略商。
  10. 除以h - m + r + 9025得到商n。忽略剩下的 。
  11. h - m + r + n + 19除以32得到p的餘數。忽略 商。

然後復活節在n個月的一天p

例如,如果y爲2001:

a = 6 
b = 20 
c = 1 
d = 5 
e = 0 
g = 6 
h = 18 
j = 0 
k = 1 
m = 0 
r = 6 
n = 4 
p = 15 

因此,在2001年復活節落在4月15日

確保您提示用戶一年,並讓用戶輸入年。另外,請確保您輸出p和n的值並使用描述值輸出的相應消息。


我有點麻煩把它放到Java代碼中。這是我試過的:

import java.util.Scanner; 



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

     int y = 2014; 
     int a = y % 19; 
     int b = y/100; 
     int c = y % 100; 
     int d = b/4; 
     int e = b % 4; 
     int g = (8 * b + 13)/25; 
     int h = (19 * a + b - d - g + 15) % 30; 
     int j = c/4; 
     int k = c % 4; 
     int m = (a + 11 * h)/319; 
     int r = (2 * e + 2 * j - k - h + m + 32) % 7; 
     int n = (h - m + r + 90)/25; 
     int p = (h - m + r + n + 19) % 32; 

     getEasterSundayMonth = n; 
     System.out.println("Month: " + Easter.getEasterSundayMonth()); 
    } 
} 

這就是我所擁有的。我不知道如何分配東西,就像我試圖讓getEasterSundayMonth等於n的值一樣,很確定它不對。我從哪裏出發?

+0

是的,這絕對會幫助我,這是我問的事情之一。向正確的方向推進將是可愛的,因爲我根本不能問教授。 – 2014-09-24 16:48:13

+0

嗯......看起來你已經完成了。你只需要在屏幕上打印p和n並指定它們是什麼 - System.out.println(「Month:」+ n); – RockOnRockOut 2014-09-24 16:50:46

+0

謝謝搖滾我一定會那樣做,但天青是正確的。我的教授很努力,他的成績非常困難。我將如何提示用戶? – 2014-09-24 16:54:31

回答

7

試試這個:

import java.util.Scanner; 

class Easter 
{ 
    public static void main(String[] args) 
    { 
     System.out.print("Please enter a year to calculate Easter Sunday\n>"); 
     Scanner s = new Scanner(System.in); 
     int inputted = getResult(s); 
     while(inputted <= 0) 
     { 
      System.out.print("Expected a positive year. Please try again:\n>"); 
      inputted = getResult(s); 
     } 
     System.out.println(getEasterSundayDate(inputted)); 
    } 

    private static int getResult(Scanner s) 
    { 
     while(!s.hasNextInt()) 
     { 
      System.out.print("Expected a valid year. Please try again:\n>"); 
      s.nextLine(); 
     } 
     return s.nextInt(); 
    } 

    public static String getEasterSundayDate(int year) 
    { 
     int a = year % 19, 
      b = year/100, 
      c = year % 100, 
      d = b/4, 
      e = b % 4, 
      g = (8 * b + 13)/25, 
      h = (19 * a + b - d - g + 15) % 30, 
      j = c/4, 
      k = c % 4, 
      m = (a + 11 * h)/319, 
      r = (2 * e + 2 * j - k - h + m + 32) % 7, 
      n = (h - m + r + 90)/25, 
      p = (h - m + r + n + 19) % 32; 

     String result; 
     switch(n) 
     { 
      case 1: 
       result = "January "; 
       break; 
      case 2: 
       result = "February "; 
       break; 
      case 3: 
       result = "March "; 
       break; 
      case 4: 
       result = "April "; 
       break; 
      case 5: 
       result = "May "; 
       break; 
      case 6: 
       result = "June "; 
       break; 
      case 7: 
       result = "July "; 
       break; 
      case 8: 
       result = "August "; 
       break; 
      case 9: 
       result = "September "; 
       break; 
      case 10: 
       result = "October "; 
       break; 
      case 11: 
       result = "November "; 
       break; 
      case 12: 
       result = "December "; 
       break; 
      default: 
       result = "error"; 
     } 

     return result + p; 
    } 
} 

2001結果April 15作爲輸出端。

+7

該評論正確回答了使用高斯1800計算的問題/作業。作爲一個警告,那些可能會遇到這個答案尋找計算復活節的算法的人,請注意高斯的方法只能保證在18世紀和19世紀。您可能更願意使用其他方法(例如,匿名格列高利)來確保20世紀及以後的準確性。請參閱http://en.wikipedia.org/wiki/Computus – 2014-11-30 04:45:17

4

您距離您的程序工作還不遠。你真的有兩件事情需要你去做。

  • 提示用戶在一年
  • 輸出的時間發現

訣竅使用Scanner,以提示用戶輸入是創建一個while循環其測試各行的用戶進入並持續重複,直到它看到合法的價值。

而不是硬編碼y = 2014;(或其他),你想要做這樣的事情:

Scanner input = new Scanner(System.in); 
int y = -1; // No easter back in B.C. 
while (y < 0) { 
    System.out.println("Please enter a year (integer greater than zero)"); 
    if (input.hasNextInt()) { // check to see if the user entered a number 
     y = input.nextInt();  // if so, read it 
    } 
    input.nextLine();   // advance the scanner to the next line of input 
} 

在這種情況下,每次用戶沒有輸入一個數字,y仍然-1和循環繼續。

您已經在正確地完成所有計算,因此要結束程序,只需輸出月份/日期。

我不打擾試圖提取計算成輔助方法。只需直接在main()使用的計算值:

int a = y % 19; 
int b = y/100; 
... 
int n = (h - m + r + 90)/25; 
int p = (h - m + r + n + 19) % 32; 
System.out.println("In the year " + y + " Easter with fall on day " + p + " of month " + n); 
+0

您應該鏈接到Java 8文檔,而不是Java 7. – gparyani 2014-09-24 17:30:12

+0

我更喜歡輔助方法,因爲它允許程序確定特定的輸出,而不是嚴格限制在人工輸入。 – gparyani 2014-09-24 21:42:27

+0

@damryfbfnetsi通常我也是如此,但是這項家庭作業的重點似乎是學習關於原語的算術,以及基本的輸入和輸出,所以這就是我關注的答案。 – azurefrog 2014-09-24 21:50:03