【发布时间】:2021-12-06 22:51:30
【问题描述】:
这是我知道的代码:
bool checkPrime(int n) {
bool prime = true;
for (int i = 2; i < n; i++) {
if ((n%i) == 0) {
prime = false;
}
}
return prime;
}
但是,如果您正在寻找素数,这可以吗:
List<int> arr = [2, 3, 5, 7]; // Already known
int n = 30; // Between 1 to 30. It could be any number
for (int i = 2; i < n; i++) {
if (i % 2 != 0 && i % 3 != 0 && i % 5 != 0 && i % 7 != 0) {
arr.add(i);
}
// Then maybe some code for numbers less than 8
}
print(arr);
输出:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
而且时间复杂度也有很大差异?
【问题讨论】:
-
因为最后一个效率高,速度快。
-
第一个示例花费的时间比它需要的多。您可以尽快
return false;n % i == 0。在函数结束时,如果您已经通过循环,您可以安全地return true;。还有其他优化,但这是最简单的。 -
感谢您的回答:我想出了第二个代码,但不确定它是否有效,并且相信其他人不仅想到了我,但也不确定
-
作为一般规则,您永远不应该编写这种形式的
checkPrime()方法。您应该使用埃拉托色尼筛法和改进来生成您感兴趣的范围内的素数,然后为每次检查进行表查找。 -
@user207421 谢谢我不知道这个埃拉托色尼筛我会检查一下