【发布时间】:2016-03-05 10:08:32
【问题描述】:
我想将所有小于 10 的素数相加。
这是我的代码:
boolean kontroll = true;
long limit = 10;
long checker = 2;
long sum = 0;
while (checker < 10) {
for (long i = 3; i < Math.sqrt(checker); i += 2) {
if (checker % 2 == 0) {
kontroll = false;
break;
} else {
if (checker % i == 0) {
kontroll = false;
}
}
} if (kontroll) {
sum += checker;
System.out.println("Prim: " + checker);
}
checker++;
kontroll = true;
}
System.out.println(sum);
我得到这个输出:
Prim: 2
Prim: 3
Prim: 4
Prim: 5
Prim: 6
Prim: 7
Prim: 8
Prim: 9
44
这个版本有什么问题?如果我删除 Math.sqrt(checker); 程序可以工作,但速度很慢。我不能取检查器的平方根吗?
【问题讨论】:
-
在 while 语句之前分配一个 float q = Math.sqrt(checker);,然后有 for(long i=2 ; i
代替。这应该会加快您的代码速度。
-
@ArifBurhan 你为什么使用
float? -
@Aminorph:您的程序没有正确识别素数,因此总和也不正确。我认为部分原因是您在 while 循环的末尾和下一次迭代中设置了“kontroll = true”,如果 for 循环甚至没有执行一次,那么下一个数字将始终用于计算总和跨度>
-
@MikeCAT double 也同样有效,但这里不需要高精度,因为您要与 long 进行比较。
-
@ArifBurhan 使用
float给了我compile error。您正在与long进行比较,那么为什么不与long进行比较呢?
标签: java performance square-root