繁体   English   中英

素数程序问题

[英]Prime Number Program Problems

我目前正在开发一个程序,其中用户输入一个数字,该程序将为您提供最多该数字的质数。 尽管没有错误,但是程序始终输出相同的数字:3.这是代码:

public static int Prime(int num){
    boolean isPrime = true;
    int count = 0;
    for (int a = 2; a <=num; a++){ 
        for (int i = 2; i <= a/2; i++){
            if (a == 2 || a == 3 || a == 5){
                isPrime = true;
            }
            else if (a % i == 0){
                isPrime = false;
            }
        }
        if (isPrime == true)
            count++;
    }
    return count;
}

在内部for循环中,您正在设置isPrime ,但随后继续循环。 如果候选除数i不能很好地划分,则随后的循环可能会将isPrime设置为false 只有23 ,和5 ,在你第一次的3个数字if条件下,将其设置为true始终,让您始终获得3

相反,设置isPrimetrue在内部的开始for循环,并break了内部的for每次设定的时间后循环isPrime 如果数字是2、3或5,则将其设置为truebreak因此没有什么可以将其设置为false ,因此可以对其进行计数。 如果找到一个因素,它不是主要因素,因此将其设置为false并使其break因此没有任何东西可以将其设置为true ,并且不计算在内。

顺便说一句,您的最终if条件测试一个boolean 可以简化为if (isPrime)

您的策略是通过扫描除自身和1以外的因素来测试从2到num每个数字的素数。这虽然可以简化,但可以实现,但是严重破坏了实现。

一种涉及扫描因子的方法意味着您首先要猜测所测试的数字是质数,然后再寻找并非如此的证据。 您已经错过了“猜测素数”部分,在您的特定代码中,它将在外部循环开始时采取将isPrime设置为true的形式。

另一方面,在测试a == 5的情况后,您的代码绝不会将isPrime重置为true 在测试a == 6的情况时,该变量将设置为false ,并且在持续时间内保持不变。 因此,对于任何大于4的输入,总会得到结果3。

如果您在外部循环中正确重置了isPrime ,那么您也可以在内部循环中删除条件的第一部分,因为这将是多余的。 无论如何,在a == 2a == 3的情况下,它永远不会执行,因为在这些情况下,内部循环执行零次迭代。

还要注意的是,一旦确定a是复合的,则从内部循环中中断会更有效,并且您对该循环运行的迭代次数比对素数进行的迭代次数要多(直到i超过的平方根a ;即,直到i * i > a )。

最后,请注意,只要您要测试的数字没有太大到需要的数组过大的程度,可以通过EratosthenesSeive (或其他素数seive之一)来更有效地实现此问题。

我通过减少检查a是2、3或5所需的操作数来简化了代码。

public static int Prime(int num) {
        int count = 0;
        if (num >= 2) {
            count++; // One optimization here
        }
        for (int a = 3; a <= num; a+=2) {  // Another one here as we don't have any even number except 2 :D
            boolean isPrime = true;
            for (int i = 2; i <= a / 2; i++) {
                if (a % i == 0) {
                    isPrime = false;
                    break;
                }
            }
            if (isPrime) {
                count++;
            }
        }
        return count;
    }
#include <iostream>
using namespace std;


int numberOfPrimes(int num)
{
if(num==2)
  return 1;
else if(num<2)
  return 0;
int prime=1;

for(int i=3;i<=num;i++)
 {
    for(int j=2;j<=(i/2)+1;j++)
     {
        if(i%j==0)
           break;
         if(j==(i/2)+1)
          prime++;

     }

 }
 return prime;
}

包com.amit.primenumber;

公共类PrimeNumber {

public static void main(String[] args) {
    long number=23L;
    String message=null;
    PrimeNumber primeNumber = new PrimeNumber();
    boolean result = primeNumber.primeNumber(number);
    if(result){
        message="a Prime Number";
    }else{
        message="Not a Prime Number";
    }

    System.out.println("The given "+number+" number is "+message);
}

public boolean primeNumber(long number){
    for(long i=2;i<=number/2;i++){
        if(number%i==0){
            return false;
        }   
    }
    return true;
}

}

package basics;

public class CheckPrimeOrNot {
    public void checkprimeNumber(int i){
        int flag=0;

        if(i>2){

            for(int j = 2; j <= i/2; j++){
                if(i%j == 0){
                    System.out.println("Given number is Not Prime");
                    flag=1;
                    break; 
                }
            }
            if(flag==0){
                System.out.println("Given number is Prime");
            }
        } else{
            System.out.println("Please enter a valid number");
        }
    }
    public static void main(String[] args) {
        CheckPrimeOrNot CheckNumber = new CheckPrimeOrNot();
        CheckNumber.checkprimeNumber(11);
        CheckNumber.checkprimeNumber(0);
        CheckNumber.checkprimeNumber(250365);
        CheckNumber.checkprimeNumber(1231);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM