2010-10-03 15 views
0

我一直在毆打我的頭靠在牆上試圖弄清楚爲什麼這會返回「錯誤的答案」。我非常感謝任何反饋。(還有另外一個)UVa 3n + 1幫助問題

編輯:我轉發了代碼,並且此版本通過允許數字對之間有多個空格來最終修復了「運行時錯誤」。它現在說的是「錯誤的答案」,但據我所知,我逐字地複製了給定的算法,所以我不知所措。

謝謝。

The Problem

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.io.IOException; 


public class Main { 

public static void main(String[] args) { 
    Main mine = new Main(); 
    mine.begin(); 
} 

public void begin(){ 
    BufferedReader sys = new BufferedReader(new InputStreamReader(System.in)); 
    String[] pair; 
    try{ 
     while((pair=sys.readLine().split(" +")).length==2){ 
      System.out.println(pair[0]+ " " +pair[1] + " " + getMax(Integer.parseInt(pair[0]),Integer.parseInt(pair[1]))); 
     } 
    }catch(IOException ex){ 
     return; 
    } 
} 

private String getMax(int a, int b){ 
    int maxcount,thiscount, num, n; 

    for(maxcount = -1, num =Math.min(a, b); num <= Math.max(a, b); num++){ 
     for(n = num, thiscount = 1; n!=1; thiscount++){ 
      if(n%2==0)n=n/2; 
      else n = 3*n +1; 
     } 
     if(thiscount>maxcount) maxcount = thiscount; 
    } 
    return String.valueOf(maxcount); 
} 
} 
+0

牆的代碼在這裏沒有幫助。你能縮小這個問題嗎? – 2010-10-03 04:59:44

+0

這是告訴我,代碼編譯和運行良好,但它無法解決問題。我真的不知道爲什麼它說錯了答案,但該「alforithm」位於getMax,getCount方法。 – James 2010-10-03 05:03:58

+0

您是否至少將樣本輸出與樣本輸入相匹配?您需要考慮可能適用於問題並處理所有問題的任何案例。 – 2010-10-03 05:18:20

回答

2
while(num<4){ 
... 

是輸入始終限制在4號線?

+0

由於某些原因,只要我不將它限制爲一個設定的數字,它就會給出「運行時錯誤」。我不知道爲什麼會發生這種情況,因爲我可以繼續提供輸入,最後以空行結束(如給定的解決方案),並且運行得很好。有任何想法嗎? – James 2010-10-03 14:19:24

+0

他們的示例數據中有一些東西讓parseInt()炸燬。也許這是一排空間,或者是一個以空間開始的線。我厭倦了很多變體,但仍然得到了錯誤的答案或運行時錯誤。 – UncleO 2010-10-04 02:12:41

+0

你有沒有嘗試在if(line.length()== 0){return;}之前添加'line = line.trim();並且捕獲NumberFormatException? – 2010-10-04 02:53:45

0

您可能想重新考慮如何解析這些行。我相信你的代碼中可能存在運行時錯誤的唯一行是整數解析。你假設每個ij由一個空格分開。這個問題沒有提到多少空白符合要求。

+0

謝謝。這似乎解決了運行時錯誤問題,但現在它說「錯誤的答案」。任何想法,爲什麼這可能是? – James 2010-10-04 14:28:54

0

如果你的答案錯了,而你的程序在樣本上工作,那麼問題可能與你使用整數而不是長整數有關。

對於3n + 1問題,中間值可能會變大,然後int可以處理(2,147,483,647),並且這是判斷數據爲惡的常用方法。

+0

感謝您的想法。我試着使用long來代替int,它仍然返回,我得到了錯誤的答案。我在網站上找到了一個解決方案(這是第一個問題,畢竟不應該是困難的)。看起來解決方案只是使用int,並且與我的代碼做同樣的事情,但是當我提交他以確保該網站沒有被竊聽時,它說「已接受」。它在這裏http://acm.uva.es/p/data/p100.java.html – James 2010-10-04 16:06:07

0

我認爲UVA法官最重要的是:

  1. 獲取輸出完全一樣。最後沒有額外的線路。
  2. 永遠不要拋出異常只是返回或中斷與外部邊界參數沒有輸出。
  3. 輸出是區分大小寫的
  4. 輸出參數應保持空間如圖所示的問題

這裏是鏈接#1:https://stackoverflow.com/a/14632770/1060656