我刚开始编程挑战并尝试解决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: }
答案 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()。主要退出时会自动发生这种情况。
一旦你的代码可读,也许有人可以指出错误