生成随机输出 3n+1 问题

generation of random output 3n+1 pblm

我一直在尝试解决 java.However 中的 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 时)。尽管算法很简单,但不知道这个猜想是否正确。然而,对于所有满足 0 < n < 1,000,000 的整数 n(事实上,对于比这更多的数字),它已经得到验证。

给定输入 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)的整数的最大循环长度。这三个数字应至少用一个 space 分隔,所有三个数字都在一行上,每行输入对应一行输出。整数 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

请帮我找出错误

问题是你在第一行中第一个数字小于第二个数字,但在第二行中第一个数字大于第二个数字。你必须交换数字或像这样预先找出更大的数字:

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