我最近开始学习C ++,并且认为我会用Project Euler问题测试我的勇气。我解决了前两个,但我坚持第三个。它正确编译没有任何错误,但它一旦执行就会崩溃。我尝试删除嵌套的for循环以隔离问题,但它仍然崩溃。
public class CloseTo1000 {
static Set<List<Integer>> powerSet = new HashSet<>();
public static void main(String[] args) {
List<Integer> mainList = new ArrayList<Integer>();
mainList.add(900);
mainList.add(500);
mainList.add(498);
mainList.add(4);
powerSet = buildPowerSet(mainList,mainList.size());
System.out.println(powerSet);
Set<List<Integer>> toremove = new HashSet<List<Integer>>(); //remove the empty set
for(List<Integer> li : powerSet){
if(li.isEmpty()){
toremove.add(li);
}
}
powerSet.removeAll(toremove);
findOptimum(powerSet);
}
private static Set<List<Integer>> buildPowerSet(List<Integer> list, int count){
powerSet.add(list);
for(int i=0; i<list.size(); i++)
{
List<Integer> temp = new ArrayList<Integer>(list);
temp.remove(i);
buildPowerSet(temp, temp.size());
}
return powerSet;
}
private static int findOptimum(Set<List<Integer>> powerSet){
int opt = 10000 ;
List<Integer> optList = new ArrayList<Integer>();
for (List<Integer> li : powerSet){
int k = Math.abs(li.stream().mapToInt(Integer :: intValue).sum()-1000);// find absolute difference to 1000
System.out.println(k);
if(k<opt){
opt=k;
optList=li;
}
if(k==opt && li.stream().mapToInt(Integer :: intValue).sum()>1000){// 999 and 1001, it should take the highest number
opt=k;
optList=li;
}
}
opt = opt +1000;
System.out.println("optList: "+optList);
System.out.println("opt: " +opt);
return opt;
}
}
答案 0 :(得分:2)
如果if((i%j)==0)
和i
为零,则在j
中,您的下一行是划分i和j。这是除零。