项目euler 23(循环)有问题

时间:2016-03-26 14:10:42

标签: java

出于某种原因,我在代码的第一个方法中遇到了问题,ans。如果你看看do while和while循环,while循环工作正常,运行LinkedHashSet中的每个元素,虽然do-while在while已经第一次运行之后停止。因此num1不会移动通过12,而num2成功地成为Set中的每个值,我不知道为什么。我通过打印num1和num2来解决这个问题,我无法弄清楚为什么会这样。任何和所有的帮助表示赞赏。这是我的代码:

import java.util.Set;
import java.util.LinkedHashSet;
import java.util.Iterator;
public class main{
public static int ans(Set<Integer> abund,int total){
    int sum;
    Object num1;
    Object num2;
    Iterator itr=abund.iterator();//creates iterator to get values from set
    do{//loop to get all values from set
        num1=itr.next();//assigns each object in set to a num
        while (itr.hasNext()){//loop to get all values from set to add
            num2=itr.next();//assigns each object in set to a num
            sum=((int) num1+(int) num2);
            total-=sum;
        }
    }while (itr.hasNext());
    return total;
}

public static boolean abun(int y){
    int x;
    int facsum=0;
    for(x=1;x<y;x++){
        if (y%x==0){
            facsum+=x;
        }
    }
    if (facsum>y){
        return true;
    }
    else{
        return false;
    }
}

public static void main(String[] args){
    int x;//for loop counter
    int y;//another for loop counter
    int total=0;//total of all numbers from 0-28123
    int fin;//final answer
    boolean abundant;
    Set<Integer> abund=new LinkedHashSet<Integer>();
    for (x=0;x<28124;x++){
        abundant=abun(x);
        if (abundant==true){
            abund.add(x);
        }
        total+=x;
    }
    fin=ans(abund,total);
    System.out.println("Final: "+fin);

}
}

由于

2 个答案:

答案 0 :(得分:1)

您需要从丰富数字A的集合中构建所有对的总和,其中 i &lt; = a j 。您无法使用单个迭代器执行此嵌套循环,根据定义,该迭代器从第一个到最后一个。使用两个迭代器或foreach循环也有些困难,因为内循环必须跳到外循环所在的位置。因此...

使用List来保存此迭代的大量数字:

public static int ans(List<Integer> abund, int total){
    for( int i = 0; i < abund.size(); ++i ){
        for( int j = i; j < abund.size(); ++j ){
            total -= abund.get(i) + abund.get(j);
        }
    }
    return total;
}

Set<Integer> abund=new HashSet<Integer>();  // List-ArrayList
fin = ans( new ArrayList( abund ), total );

实际上,只使用List就足够了,因为无论如何数字都是不同的。

答案 1 :(得分:1)

Iterator是指向集合的指针。而你只分配一个。内循环完成后,代码将立即退出外循环。如果你需要在现场迭代两次。您将需要两个迭代器。 但我建议将set转换为数组(Integer [] ab = abund.toArray()。

使用进行循环。