2016-10-08 35 views
-3

From USACO Training Page,Friday 13th 問題描述爲計算第13次將在1990年1月1日至1990年12月31日的每一天的每一天着陸的頻率,其中N是給定的。 1990年1月1日是星期一,閏年被考慮在內。該計劃應打印週六13日的數字,週日13日的數字等,直至週五。 我似乎無法在我的代碼中找到問題,而且我已經嘗試了幾天。編輯 - 你不允許使用日期函數爲程序 我給N個輸出= 20 37 34 35 34 36 36 35我的USACO星期五第十三個解決方案有什麼問題?

它應該是36 33 34 33 35 35 34

import java.io.*; 
class friday { 

public static void main(String[] args) throws IOException { 
    BufferedReader in = new BufferedReader(new FileReader("friday.in")); 
    PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("friday.out"))); 

    int N = Integer.parseInt(in.readLine()); 
    int[] monthDays = {0,31,28,31,30,31,30,31,31,30,31,30,31}; 

    int firstdayNo=2; 
    int THIRdayNo; 
    int[] counter = new int[8]; 
    Arrays.fill(counter, 1); 
    for (int j=1900; j<1900+N;j++) { 
     if (j%4==0 && j%100 !=0 || j%400==0) { 
      monthDays[2]=29; 
     } 

     else { 
      monthDays[2]=28; 
     } 



     for (int i=1; i<13; i++) { 
      if (firstdayNo==2) { 
       THIRdayNo=7; 

      } 
      else { 
       THIRdayNo=(firstdayNo+12)%7; 
      } 
      counter[THIRdayNo]++; 
      firstdayNo= (monthDays[i]%7) +firstdayNo; 

      if (firstdayNo>7) {firstdayNo=firstdayNo-7;} 
      // to here, and you are done 
      } 

    } 
    out.println(+counter[7]+" "+ counter[1]+" "+counter[2]+" "+ counter[3]+ " "+counter[4]+" "+counter[5]+" "+counter[6]); 
    in.close(); 
    out.close(); 
    System.exit(0); 
} 

} 
+0

「應該打印星期六13號週五的號碼」這裏有什麼不對勁:我無法想象週六怎麼會發生星期五。 –

+0

對不起,我不喜歡修復它 – MathmagicalWasp

回答

0

java.util.CalendarGregorianCalendar作爲標準民用日期,已經處理每個月的月份(僅使用Calendar.add(Calendar.MONTH, 1)),還記錄閏年並知道如何處理DAY_OF_WEEK。所以:

static public void main(String[] arg) { 
    int N=20; 

    TreeMap<Integer, Integer> dayOfWeekOccurs=new TreeMap<>(); 
    // DAY_OF_WEEK is 1-based 
    for(int dayOfWeek=1; dayOfWeek<=7; dayOfWeek++) { 
     dayOfWeekOccurs.put(dayOfWeek, 0); 
    } 

    // month is 0-based, DAY_OF_MONTH is 1-based, YEAR is 0-based. 
    // Consistency be damn'd. 
    GregorianCalendar start=new GregorianCalendar(1990, 0, 13); 
    GregorianCalendar end=new GregorianCalendar(1990+N-1, 11, 31); 

    while(start.compareTo(end)<0) { 
     start.add(Calendar.MONTH, 1); 
     int dayOfWeek=start.get(Calendar.DAY_OF_WEEK); 
     int oldOccurs=dayOfWeekOccurs.get(dayOfWeek); 
     dayOfWeekOccurs.put(dayOfWeek, ++oldOccurs); 
    } 

    System.out.println("13 on Sun: "+dayOfWeekOccurs.get(Calendar.SUNDAY)); 
    System.out.println("13 on Mon: "+dayOfWeekOccurs.get(Calendar.MONDAY)); 
    System.out.println("13 on Tue: "+dayOfWeekOccurs.get(Calendar.TUESDAY)); 
    System.out.println("13 on Wed: "+dayOfWeekOccurs.get(Calendar.WEDNESDAY)); 
    System.out.println("13 on Thu: "+dayOfWeekOccurs.get(Calendar.THURSDAY)); 
    System.out.println("13 on Fri: "+dayOfWeekOccurs.get(Calendar.FRIDAY)); 
    System.out.println("13 on Sat: "+dayOfWeekOccurs.get(Calendar.SATURDAY)); 
    } 
+0

我改變了我的解釋 - 也不能使用日期函數的問題:( – MathmagicalWasp

+0

@KabbageSenthilkumar太糟糕了(誰禁止你這樣做有一些虐待傾向)然後我猜你仍然可以使用該技術來診斷您的代碼問題:使您的代碼輸出13日的星期幾,並使用公曆代碼找出它們何時失去同步並診斷原因(順便說一句,嘗試使用0-代碼看起來很尷尬,基於1的代碼)。 –

相關問題