2015-08-21 40 views
0

我一直在试图解决java.lang中的3n + 1问题,但是我的输出似乎是非常随机的。问题是 考虑以下算法:随机输出的生成3n + 1 pblm

1.  input n 
    2.  print n 
    3.  if n = 1 then STOP 
    4.  if n is odd then tex2html_wrap_inline44 
    5.  else tex2html_wrap_inline46 
    6.  GOTO 2 

给出的输入端22,数字的下面的序列将被印刷22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1

它推测上述算法将终止(当打印1时)任何积分输入值。尽管算法很简单,但是这个猜想是否属实却是未知数。然而,已经验证了对于所有整数n,使得1000000(并且事实上,对于比这更多的数字)

给定输入n,可以确定数字的数量印刷(包括1)。对于给定的n,这称为n的周期长度。在上面的示例中,22的周期长度为16.

对于任何两个数字i和j,您都要确定i和j之间所有数字的最大周期长度。

所述输入

输入将包括一系列对整数i和j,一对每行整数的组成。所有整数将小于1,000,000且大于0.

您应处理所有整数对,并为每对确定i和j之间(包括i和j)之间的所有整数的最大循环长度。

您可以假定没有操作溢出32位整数。

输出

对于每对输入整数i和j你应该输出的I,J,和用于之间且包括i和j的整数的最大周期长度。这三个数字应该由至少一个空格分隔,所有三个数字在一行上并且每行输入使用一行输出。整数i和j必须以它们出现在输入中的相同顺序出现在输出中,并且后面应跟着最大循环长度(在同一行上)。 我的代码如下

class CC 
{ 
    int c,f,l,m; 
    int returnCount(int i,int j) 
    { 
    f=0; 
    for(int k=i;k<=j;k++) 
    { 
     l=k; 
     c=0; 
     while(l>1) 
     { 
      if(l%2==0) 
       { 
        l=l/2; 
        c++; 
       }   
      else 
       { 
        l=3*l+1; 
        c++; 
       } 

     } 
     if(f<c) 
     f=++c; 
    } 
    return f; 
    } 
public static void main(String[] args) { 
    Scanner sc=new Scanner(System.in); 
int i,j;  
    CC obj=new CC(); 
    while(sc.hasNextInt()) 
    { 
     i=sc.nextInt(); 
     j=sc.nextInt(); 
     System.out.println(i+" "+j+" "+obj.returnCount(i,j)); 
}}} 

现在,作为给我的输入

605293 606510 
956739 956006 
826611 825983 
756134 756776 
478642 479101 
815892 815933 
719220 719135 
929349 929040 

和预期产量

605293 606510 341 
956739 956006 352 
826611 825983 313 
756134 756776 362 
478642 479101 338 
815892 815933 269 
719220 719135 274 
929349 929040 339 

但是我的输出是

605293 606510 341 
956739 956006 0 
826611 825983 0 
756134 756776 362 
478642 479101 338 
815892 815933 269 
719220 719135 0 
929349 929040 0 

请帮我找到mista ke

回答

1

问题是你的第一行第一个数小于第二个数,但在第二行第一个数大于第二个数。你必须切换数字或找出一个较大的前期那样:

import java.util.Scanner; 

public class CC { 

    int c, f, l, m; 

    int returnCount(int i, int j) { 
     int smaller = Math.min(i, j); 
     int bigger = Math.max(i, j); 

     f = 0; 
     for (int k = smaller; k <= bigger; k++) { 
      l = k; 
      c = 0; 
      while (l > 1) { 
       if (l % 2 == 0) { 
        l = l/2; 
        c++; 
       } else { 
        l = 3 * l + 1; 
        c++; 
       } 

      } 
      if (f < c) 
       f = ++c; 
     } 
     return f; 
    } 

    public static void main(String[] args) { 
     Scanner sc = new Scanner(System.in); 
     int i, j; 
     CC obj = new CC(); 
     while (sc.hasNextInt()) { 
      i = sc.nextInt(); 
      j = sc.nextInt(); 
      System.out.println(i + " " + j + " " + obj.returnCount(i, j)); 
     } 
    } 

} 

输入和输出看起来那么像:

956739 
956006 
956739 956006 352 
+0

非常感谢。我不相信我没有注意到... – ji2495