Java 使用模运算符获取素数

Java 使用模运算符获取素数,java,Java,您将如何修改以下内容以打印出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)){

您将如何修改以下内容以打印出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;
    }

}
公共类测试{
/**
*@param args
*/
公共静态void main(字符串[]args){
对于(int i=1;i
一旦找到一个不可整除的数字,就返回true,即使它以后确实有因子。

请尝试此方法

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;
}
public静态布尔值isPrime(整数){

对于(int i=2;i*i,这里有几个问题。首先,当检查一个数字是否为素数时,千万不要检查每个数字是否与被检查的素数相等。检查所有素数的平方根就足够了

要修复该错误,请查看for循环条件并相应地进行编辑:

for(int i=2; i<=number; i++)
如果此条件变为else语句,即使有一次它将返回true,则需要确保只有在选中所有要返回的数字后才返回true

此外,我认为你没有仔细考虑过你的基本情况是什么。你最后一行的意思是,如果之前的所有东西都漏掉了,那么它应该假设这个数字不是素数。想想看,我肯定你能找到它。

特别指出,一个不能是素数。

这意味着,
isPrime(1)
应该返回false。您的实现会返回false


但是
isPrime(2)
应该返回true。您的实现不会返回true。这不是因为
(2%2==0)
并且您正在检查从2到N的所有数字,而不是从2到N-1的所有数字。最后一个数字N将始终产生零余数
(N%N==0)

处理素数时需要考虑的几件事。在开始时,2可以有一个特例(例如,类似于
if(number==2)
…)


除了你一直检查到
i的错误之外,这将起作用。2是测试素数时的一个特例。如果你开始搜索越来越大的…你可能想看看埃拉托芬的筛子

每个素数都是另一个数的倍数。以3为例。使用筛子,如果你发现3是素数,那么它将“忽略”所有3的倍数,从而减少找到后续素数所需的时间。它会加快速度…很多:)

公共类JavaApplication47{
公共静态void main(字符串[]args){

对于(inti=1;i,这里有一个确定一个数字是否为素数的算法

  • 数字是否小于2?如果是,则返回false
  • 数字是2还是3?如果是,则返回true
  • 数字是4吗?如果是,则返回false
  • 取数字的平方根,四舍五入到下一个整数。这对于小素数是可选的,但对于较大的数,这会加快确定速度
  • 从5循环到数字(或数字)的平方根,递增2。
    • 将循环数除以到目前为止确定的素数
    • 如果除法的模数为零,则返回false
  • 如果循环完成,则返回true

你问这到底是为什么?你尝试了什么,什么不起作用?你在iPrime中的for循环被破坏了。它总是在第一次迭代中返回。另外,请调试我的代码问题通常不适用于此网站。@ClassicThunder他问为什么它不能按预期工作(因此逻辑错误在哪里)。对我来说,这似乎是一个完全合法的问题。这个问题是关于逻辑的,这一事实并不意味着可以问“请为我调试以下代码”问题。可能的重复代码可以用
return false;
;)替换所有代码。)修正打字错误。虽然这是一个答案,但你正在做OP的工作。参考@LuiggiMendoza不知道这是作业,将编辑为不太容易出问题不难意识到这是作业(我怀疑你在工作中解决了这类问题)@LuiggiMendoza是的,可能应该抓到它,但这是一个漫长的一天。更新为更多的反馈和更少的分发。请不要尝试这个…它也坏了。请在发布这些答案之前参考(同时,你也可以查看你发布的内容)我知道旧线程,但这是从哪里来的?有来源吗?我差不多七年前写过这篇文章,所以如果有来源,我不记得了。平方根技巧非常常见。你也可以将for循环增加2,避免除以2的测试。
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;
}
for(int i=2; i<=number; i++)
if (i%number == 0) {
   return false;
} else {
   return true;
}
 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;
}
}
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;

            }
        }

    }
}