结束冰雹序列 (Java)
Ending a Hailstone Sequence (Java)
对于我的 class,我必须编写一个程序,我们必须从任意数字创建冰雹序列
(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]
我建议编写一个方法,当您的列表以 4,2,1,4,2,1 结尾时 returns 为真:
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)) {
我相信您是在问如何检查正在构建的列表中的数字序列。
这可以通过多种方式完成。可能最简单的就是在您正在构建的列表中搜索模式。
static final List<Integer> PATTERN = Arrays.toList(4, 2, 1, 4, 2, 1);
if (Collections.indexOfSublist(list, PATTERN) >= 0) {
...
}
这不是非常有效 - 它会在每次迭代时进行详尽搜索。我无法想象这对您来说会是个问题,但如果是,则使用 List.subList
来搜索最后的 PATTERN.size()
个元素。
没错。试试这个,我认为它会起作用:
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);
}
对于我的 class,我必须编写一个程序,我们必须从任意数字创建冰雹序列 (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]
我建议编写一个方法,当您的列表以 4,2,1,4,2,1 结尾时 returns 为真:
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)) {
我相信您是在问如何检查正在构建的列表中的数字序列。
这可以通过多种方式完成。可能最简单的就是在您正在构建的列表中搜索模式。
static final List<Integer> PATTERN = Arrays.toList(4, 2, 1, 4, 2, 1);
if (Collections.indexOfSublist(list, PATTERN) >= 0) {
...
}
这不是非常有效 - 它会在每次迭代时进行详尽搜索。我无法想象这对您来说会是个问题,但如果是,则使用 List.subList
来搜索最后的 PATTERN.size()
个元素。
没错。试试这个,我认为它会起作用:
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);
}