产生随机输出3n + 1 pblm

时间:2015-08-21 13:04:16

标签: java algorithm error-correction

我一直在尝试解决java中的3n + 1问题。但是我的输出似乎很随机。问题是 请考虑以下算法:

    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,0 <0。 n&lt; 1,000,000(事实上,还有更多的数字。)

给定输入n,可以确定打印的数字(包括1)。对于给定的n,这称为n的循环长度。在上面的例子中,循环长度为22。

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

输入

输入将包含一系列整数i和j,每行一对整数。所有整数都小于1,000,000且大于0。

您应该处理所有整数对,并且每对确定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

请帮我找到错误

1 个答案:

答案 0 :(得分:1)

问题是你在第一行中的第一个数字小于第二个数字,但在第二行中第一个数字大于第二个数字。你必须改变这些数字,或者像以前一样找出更大的数字:

model1

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

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));
        }
    }

}