您如何修改以下内容以打印1-100中的所有素数?下面有一个问题,2号回归不是素数。数字2满足if(i%number == 0)条件,因为2%2返回为0.
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
for(int i=1; i<=100; i++){
if(isPrime(i)){
System.out.println(i + " is a prime number");
}else{
System.out.println(i + " is not a prime number");
}
}
}
public static boolean isPrime(int number){
for(int i=2; i<=number; i++){
if(i%number == 0){
return false;
}else{
return true;
}
}
return false;
}
}
答案 0 :(得分:2)
i<=number
您不应该检查该数字是否可以被本身整除。
您还有另一个问题:
}else{
return true;
}
一旦找到一个不可分割的数字,即使它后来确实存在因素,你就会返回true。
答案 1 :(得分:2)
这是一个用于确定数字是否为素数的算法。
答案 2 :(得分:1)
你这里有几个问题。首先,在检查数字是否为素数时,不要检查每个数字,直到检查质量的实际数字。检查所有素数直到数字的平方根将始终是足够的。
要修复该错误,请查看for循环条件并相应地进行编辑:
for(int i=2; i<=number; i++)
其次,当一个函数返回时它停止。目前使用if / else语句:
if (i%number == 0) {
return false;
} else {
return true;
}
如果这个条件转到else语句,即使它返回true,你也要确保在检查了你想要的所有数字时才真正返回true。
此外,我认为你没有仔细考虑过你的基础案例。你在最后一行中所说的是,如果以前所有的东西都穿过裂缝,那么它应该假设这个数字不是素数。想一想,我相信你能够弄明白。
答案 3 :(得分:1)
这会奏效。 2是测试质数时的特殊情况。如果你开始搜索越来越大的...你可能想看看eratosphenes的筛子。
每个素数都是另一个数的倍数。以3为例。使用筛子,如果你发现3为素数,那么它将“忽略”3的所有倍数,从而减少了找到后续质数所需的时间。它加快了速度...... ALOT:)
public class JavaApplication47 {
public static void main(String[] args) {
for(int i=1; i<=100; i++){
if(isPrime(i)){
System.out.println(i + " is a prime number");
}else{
// System.out.println(i + " is not a prime number");
}
}
}
public static boolean isPrime(int n) {
for(int i=2; 2*i<n; i++) {
if(n%i==0)
return false;
}
return true;
}
}
SIEVE示例 - 未实现 - 可用于参考和理解。
static boolean [] allPrimes = new boolean[10000];
public static void fillTheSieve(){
Arrays.fill(allPrimes, true);
allPrimes[0] = allPrimes[1] = false; //1 and 0 are false. winning
for (int i = 2; i < allPrimes.length; i++) {
//check if prime, if so getmultiples and declae false
if(allPrimes[i]){
for (int j = 2; i*j<allPrimes.length; j++) {
allPrimes[i*j] = false;
}
}
}
}
答案 4 :(得分:0)
The definition of a prime number明确指出一个人不能成为素数。
这意味着isPrime(1)
应该返回false。你的实现是做什么的。
但是isPrime(2)
应该返回true。你的实现没有。它不是因为(2 % 2 == 0)
并且您正在检查从2到N的所有数字,而不是从2到N-1。最后一个数字N将始终产生零余数(N % N == 0)
答案 5 :(得分:0)
与Primes打交道时要考虑的几件事情。您可以在开始时使用2的特殊情况(例如if(number == 2)
...)。
除了检查i<=number
之前的错误之外,只考虑您需要走多远才能确定它不是素数,因此i*i
或{已提供了提示{1}}
增量Math.sqrt
中的另一件事是考虑到这个问题,我意识到这只适用于前100个素数,但你应该总是考虑性能。你真的必须检查所有数字(2,3,4,5,6 ......)(提示:如果你检查它是否可以被2整除,那么你不需要检查4,6,8等...)
最后使用您的return语句,考虑使用仅在正数时设置为false / true的i++
标志,该数字是素数还是不是。而且你只需要使用1个return语句。
希望有所帮助。
答案 6 :(得分:-3)
请试试这个
public static boolean isPrime(int number) {
for(int i = 2; i * i <= number; i++) {
if (i % number == 0) {
return false;
} else {
return true;
}
}
return true;
}