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

Posted

技术标签:

【中文标题】生成随机输出 3n+1 问题【英文标题】:generation of random output 3n+1 pblm 【发布时间】:2015-08-21 13:04:16 【问题描述】:

我一直在尝试解决 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)。对于给定的 n,这称为 n 的周期长度。在上面的例子中,22 的循环长度是 16。

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

输入

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

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

请帮我找出错误

【问题讨论】:

【参考方案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

【讨论】:

以上是关于生成随机输出 3n+1 问题的主要内容,如果未能解决你的问题,请参考以下文章

C语言问题求解! 为啥会输出随机数

在java中,如何输出不重复的几个随机数

为啥我的随机数生成器不产生输出? [关闭]

随机生成30道四则运算

python两个10以内的随机整数以第一个随机整数为半径第二个随机整数为高,计算并输出圆锥体的体积

用C语言写出一道关于随机数的编程题