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

标签 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 < n < 1,000,000(事实上,比这更多的数字。)

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

关于java - 生成随机输出 3n+1 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32141062/

相关文章:

algorithm - Tarjan的最低共同祖先算法解释

c++ - schifra 库上的 RS-Code - 如何设置多项式?

java - 我使用 CardLayout 得到 NullPointerException

c - 我有一个链表,我想删除重复的值

java - 当我从 C++ 调用 Java 方法时,我应该调用 PushLocalFrame 和 PopLocalFrame 吗?

algorithm - 给定倒排次数的列表的冒泡排序和插入排序的复杂度

algorithm - 如何确定 6 + 1 位数字的最大纠错/检测方法?

go - 从 QR 码编码计算 Reed-Solomon 纠错码字

java - 调用持久/合并时如何忽略级联

Java JDBC 连接状态