【问题标题】:Ending a Hailstone Sequence (Java)结束冰雹序列 (Java)
【发布时间】:2015-01-15 02:54:25
【问题描述】:

对于我的班级,我必须编写一个程序,我们必须从任何数字创建一个冰雹序列 (冰雹是一种数学理论,如果你将偶数除以 2,奇数乘以 3 再加 1,那么你最终会得到 4,2,1,4,2,1 的无穷模式)

我的提示是在程序到达 4,2,1,4,2,1 的两个序列后切断程序。目前我的代码正在运行,我可以在此模式的一个序列中将其切断。但是,我无法找出一个循环来在最后停止它。我的问题是,我是否将代码设置为无法捕捉到第二个序列?

代码:

Scanner inData = new Scanner(new File("test.txt"));
    ArrayList<Integer> list= new ArrayList<Integer>();

    while(inData.hasNext())
            {
                int num=inData.nextInt();
                int var=list.size();
                list.add(num);

                while(num>1)
                {
                    if(num%2==0)
                    {
                        num/=2;
                        list.add(num);


                    }

                    else
                    {
                        num=(num*3)+1;
                        list.add(num);
                    }
                }


                System.out.print(list);
            }

}

文本输入为 10 的输出应为: [10、5、16、8、4、2、1、4、2、1] 目前: [10、5、16、8、4、2、1]

【问题讨论】:

    标签: java arraylist


    【解决方案1】:

    我建议编写一个在列表以 4,2,1,4,2,1 结尾时返回 true 的方法:

    private boolean finished(List<Integer> list) {
        int len = list.length();
    
        // check for minimum of 6 entries
        if(len < 6) {
            return false;
        }
    
        return list.get(len-1) == 1
            && list.get(len-2) == 2
            && list.get(len-3) == 4
            && list.get(len-4) == 1
            && list.get(len-5) == 2
            && list.get(len-6) == 4;
    }
    

    然后将您的 while 循环更改为:

    while(num>1 && !finished(list)) {
    

    【讨论】:

    • 好的,我会试试这个并回复你。谢谢!
    • 成功了!谢谢!我唯一改变的是你建议的第二部分!完成了,我不得不删除 num>1 因为那会阻止 eclipse 打印两次
    【解决方案2】:

    我相信您问的是如何检查您正在构建的列表中的数字序列。

    这可以通过多种方式完成。可能最简单的方法就是在您正在构建的列表中搜索模式。

    static final List<Integer> PATTERN = Arrays.toList(4, 2, 1, 4, 2, 1);
    if (Collections.indexOfSublist(list, PATTERN) >= 0) {
        ...
    }
    

    这不是非常有效 - 它每次迭代都会进行详尽的搜索。我无法想象这对您来说会是个问题,但如果是这样,请使用 List.subList 来搜索最后一个 PATTERN.size() 元素。

    【讨论】:

    • PATTERN 应该是 4, 2, 1, 4, 2, 1。
    • 谢谢 - 好点子。还更改为使用 Collections 实用程序以使其更简单。
    【解决方案3】:

    没错。试试这个,我认为它会起作用:

    Scanner inData = new Scanner(new File("test.txt"));
    ArrayList<Integer> list= new ArrayList<Integer>();
    
    while(inData.hasNext())
    {
        int num=inData.nextInt();
        int seq = 2
        list.add(num);
    
        while((num>1)&&(seq>0))
        {
            if(num%2==0)
            {
                num/=2;
                list.add(num);
            }
            else
            {
                if(num==1){
                    seq -= 1;
                }
                num=(num*3)+1;
                list.add(num);
            }
        }
    
        System.out.print(list);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-29
      • 2020-09-06
      相关资源
      最近更新 更多