我在Java中的3n + 1解决方案判断错误/运行时错误,为什么?

时间:2010-12-14 06:17:40

标签: java

我刚开始编程挑战并尝试解决3n+1 problem。我的程序在UVA判断中给出了RUNTIME ERROR,在编程挑战判断中给出了错误的答案。但是我没有在程序中发现任何错误。所有测试用例都为我提供了正确的答案。任何人都可以告诉我可能出现的问题

    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: }

1 个答案:

答案 0 :(得分:0)

您的代码存在很多可读性问题。我甚至看不到算法中的错误,因为它缺乏可读性。

在结构上,正如其他人所提到的,它并没有很好地分裂。您至少应该有一个getRanges()函数来接受所有用户输入,并且getMaxCycleLen(i,j)方法可以计算特定周期的周期长度。

样式方面,正如其他人所提到的,您的变量名称不具有描述性。变量名称几乎不应该是1或2个字符长(当然,i,j,k除外)。它们既需要描述变量的用途(计数器,索引,maxCycles等),也要足够长,以便在代码中搜索(在中间看到多少次“a”或“ar”)其他一些关键字/评论/变量?)。

如果它是一个数组数组(aray [50] [2]),那么你的aray变量会更具可读性。你写它的方式,很难跟踪发生了什么。

第7行声明aray为50个条目。这意味着当提供超过50个条目时,您的代码将失败。 (这可能是您的运行时错误)

第26行:这个循环很奇怪。你明显试图处理无序操作数时我+ = c。如果你只是反转a和(tmp = a; a = b; b = a;)

,你的循环约束将更具可读性

第36行:您不需要调用system.exit()。主要退出时会自动发生这种情况。

一旦你的代码可读,也许有人可以指出错误