对于我的班级,我必须编写一个程序,我们必须从任何数字创建一个Hailstone序列 (Hailstone是一个数学理论,如果你将偶数除以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]
答案 0 :(得分:1)
我建议编写一个方法,当列表以4,2,1,4,2,1:
结尾时返回trueprivate 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)) {
答案 1 :(得分:1)
我相信您已经在询问如何查看正在构建的列表中的一系列数字。
这可以通过多种方式完成。可能最简单的只是在您正在构建的列表中搜索模式。
static final List<Integer> PATTERN = Arrays.toList(4, 2, 1, 4, 2, 1);
if (Collections.indexOfSublist(list, PATTERN) >= 0) {
...
}
这不是非常有效 - 它每次迭代都会进行详尽的搜索。我无法想象这会对您造成问题,但如果是,则使用List.subList
来搜索最后的PATTERN.size()
元素。
答案 2 :(得分:0)
没错。尝试这个,我认为这将起作用:
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);
}