2010-12-14 32 views
0

我剛從編程挑戰開始,試着解決3n+1 problem。我的程序在UVA判斷中給出了RUNTIME ERROR,在編程挑戰判斷中給出了WRONG ANSWER。但是我沒有在程序中發現任何錯誤..所有的測試用例都給出了正確的答案。有誰可以告訴我什麼可能是錯誤的我的Java 3n + 1解決方案判斷錯誤/運行時錯誤,爲什麼?

1: import java.io.*; 
    2: import java.util.*; 
    3: class Main{ 
    4:  public static void main(String args[]) throws IOException{ 
    5:   BufferedReader br=new BufferedReader(new 
InputStreamReader(System.in)); 
    6:   String s,ar[]; 
    7:   long aray[]=new long[50]; 
    8:   int n=0,maxcount=0,count; 
    9:   long t,a,b,c=1,co=0; 
    10:  while((s=br.readLine()).length()>0) { 
    11:    ar=s.split(" "); 
    12:    aray[n++]=Long.parseLong(ar[0]); 
    13:    aray[n++]=Long.parseLong(ar[1]); 
    14:   } 
    15:   
    16:   for(int j=0;j<n;) { 
    17:    c=1; 
    18:    maxcount=0; 
    19:    a=aray[j++]; 
    20:    b=aray[j++]; 
    21:    co=b-a+1; 
    22:    if(a>b){    //special case 
    23:     c=-1; 
    24:     co=a-b+1; 
    25:    } 
    26:    for(long i=a,k=0;k<co;i+=c,k++){ 
    27:     t=i; 
    28:     count=1; 
    29:     while(t!=1){ 
    30:      if(t%2==0) t=t/2; 
    31:      else t=(3*t)+1; 
    32:      count++; 
    33:     } 
    34:    maxcount=(maxcount>count)?maxcount:count; 
    35:   } 
    36:   System.out.println(a+" "+b+" "+maxcount); 
    36:   System.exit(0); 
    38:  } 
    39: } 
+2

的指針賦值會很酷的bug(一個或多個)。和代碼格式(縮進)。並使用可讀名稱作爲變量名稱。 – 2010-12-14 07:15:02

+1

順便說一句 - 你並不孤單:[這是關於該任務的另一個問題](http://stackoverflow.com/questions/1997215/why-is-my-3n1-problem-solution-wrong)。 – 2010-12-14 07:17:04

+0

除了有意義的單元測試之外,我還建議您也使用方法來分解代碼和有意義的變量名稱。有很多地方你的代碼可能會被炸燬,你知道運行時異常是什麼嗎? – 2010-12-14 07:58:45

回答

0

你的代碼有很多可讀性問題。由於缺乏可讀性,我甚至無法看到算法中的錯誤。

在結構上,正如其他人所說,它沒有很好地分離。您至少應該有一個getRanges()函數來接受所有用戶輸入和一個getMaxCycleLen(i,j)方法來計算特定週期的週期長度。

風格方面,正如其他人所提到的,您的變量名稱不具有描述性。變量名稱幾乎不應該是1或2個字符長(當然,i,j,k除外)。它們需要同時描述變量的用途(counter,index,maxCycles等)並且足夠長以便在代碼中搜索(您在中間看到多少次「a」或「ar」一些其他的關鍵字/評論/變量?)。

如果你的aray變量是一個數組數組(aray [50] [2]),那麼你的aray變量將更具可讀性。你寫它的方式,很難跟蹤發生的事情。

第7行聲明aray長度爲50個條目。這意味着當提供超過50個條目時,您的代碼將失敗。 (這可能是您的運行時間錯誤)

第26行:此循環很奇怪。你i + = c顯然是爲了處理亂序操作數。如果你只是反過來並且是(tmp = a; a = b; b = a;),那麼你的循環約束將更具可讀性,第36行:你不需要調用system.exit()。當主要退出時,這會自動發生。

一旦你讓你的代碼的可讀性,也許會有人能夠指向

相關問題