项目Euler解决方案#3(Java):调试

项目Euler解决方案#3(Java):调试,java,debugging,Java,Debugging,不久前,我开始了Euler项目的工作,我已经完成了问题3的代码。任务是找到大数(600851475143)中的最大素因子。我已经用Java完成了代码,但是我有一个调试问题 链接 当我尝试运行它时,它返回以下错误: 线程“main”java.lang.IndexOutOfBoundsException中的异常:索引:1,大小:1 位于java.util.ArrayList.rangeCheck(ArrayList.java:653) 获取(ArrayList.java:429) 在main.mai

不久前,我开始了Euler项目的工作,我已经完成了问题3的代码。任务是找到大数(600851475143)中的最大素因子。我已经用Java完成了代码,但是我有一个调试问题

链接

当我尝试运行它时,它返回以下错误:

线程“main”java.lang.IndexOutOfBoundsException中的异常:索引:1,大小:1
位于java.util.ArrayList.rangeCheck(ArrayList.java:653)
获取(ArrayList.java:429)
在main.main(main.java:24)

这是我的代码:

import java.util.ArrayList;
import java.util.List;

public class main {

    public static void main(String[] args) {
        long n = 600851475143L;
        int factor = 1;
        List<Integer> factors = new ArrayList<Integer>();
        List<Integer> pfactors = new ArrayList<Integer>();
        int position = 0;
        int testn = 1;

        while (factor <= n) {
            if (n % factor == 0) {
                factors.add(factor);
                factor++;
            }
            else {
                factor++;
            }

            while (position <= factors.size()) {
                while (factors.get(position) >= testn) {
                    if (factors.get(position) % testn == 0 && testn != 1 && testn != factors.get(position)) {
                        position++;
                    }
                    else {
                        pfactors.add(factors.get(position));
                        position++;
                    }
                }
            }
            int length = pfactors.size();
            System.out.println(pfactors.get(length));
        }
    }
}
import java.util.ArrayList;
导入java.util.List;
公共班机{
公共静态void main(字符串[]args){
长n=600851475143L;
整数因子=1;
列表因子=新的ArrayList();
List pfactors=new ArrayList();
int位置=0;
int testn=1;

while(factor列表指示值在[0,size-1]范围内。因此,
while
条件应为
position
而不是
从阅读消息开始定位。浏览异常的javadoc以了解它的含义以及抛出的时间。在代码中找到第24行。问问自己为什么在该行抛出此异常。如果找不到原因,请使用调试器。请尊重Project Euler不共享解决方案的愿望。(
[…]请您慎重考虑,不要发布任何可能会明确泄露如何解决特定问题的内容。
。我尝试了它,但后来它返回了相同的错误。列表中是否还有我可能遗漏的问题?@hydromend您在
System.out.println行中也有相同的问题(pfacts.get(length));
(应该是
length-1
而不是
length
)。我认为这是一个解决方案,但当我尝试时,它说它超出了范围,因为从长度中减去1将使其为负值。我猜我的列表没有元素,这没有任何意义。你建议我怎么做?你必须检查列表是否为空(
pfacts.isEmpty()
)。如果是,请不要访问该列表。如果您的算法本身不起作用,则应针对特定问题提出新问题。