素数编程问题

时间:2015-04-30 18:30:15

标签: java numbers

我目前正在开发一个程序,用户输入一个数字,程序将为您提供最多该数字的素数。虽然没有错误,但程序始终输出相同的数字: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;
}

5 个答案:

答案 0 :(得分:3)

在您的内部<select name="SELECT1" id="select1" class="Assessment"> <option value="0">OPTION 1</option> <option value="1" selected>OPTION 2</option> </select> <select name="select2" id="select2" class="Assessment"> <option value="0">OPTION 1</option> <option value="1">OPTION 2</option> <option value="2" selected>OPTION 3</option> </select> <select name="select3" id="select3" class="Assessment"> <option value="0">OPTION 1</option> <option value="1">OPTION 2</option> <option value="2" selected>OPTION 3</option> </select>Score: <input type="text" name="ScoreTot" id="ScoreTot" value="">循环中,您正在设置for,但随后您将继续循环播放。如果候选除数isPrime没有干净地划分,则后续循环可以将isPrime设置为false。只有i23,您的第一个5条件中的3个数字始终将其设置为if,因此您总是得到{{1} }}

相反,在内部true循环开始时将3设置为isPrime,并在每次使用后将true设置为内部for循环设置break。如果数字为2,3或5,则设置为forisPrime,因此无法将其设置为true,因此您可以对其进行计数。如果您找到了一个因素,则它不是素数,因此设置为breakfalse,因此无法将其设置为false并且不计算它。

顺便提一下,您的最终break条件会测试true;它可以简化为if

答案 1 :(得分:1)

您的策略是通过扫描除自身和其他因素之外的因素来测试从2到num的每个数字的原始性。虽然有点简单,但您的实现严重受损。< / p>

涉及扫描因子的方法意味着您首先猜测被测试的数字是素数,然后去寻找它不是的证据。你已经错过了猜测它的巅峰时期&#34;部分,在您的特定代码中,它将采用在外部循环开头设置isPrimetrue的形式。

另一方面,在测试isPrime的情况后,您的代码永远不会将true重置为a == 5。在测试false的情况时,该变量将设置为a == 6,并且在此期间保持不变。这就是为什么你总是得到任何大于4的输入结果3。

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

另请注意,一旦确定a是复合的,并且您运行的循环次数多于您需要为素数进行的迭代,那么从内循环中断会更有效率(它会足够循环,直到i超过a的平方根;也就是说,直到i * i > a)。

最后,请注意,只要您要测试的数字不是那么大,以至于所需的数组将是Seive of Eratosthenes(或其他素数的其中一个),这个问题会更有效地实现。非常大。

答案 2 :(得分:1)

#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;
}

答案 3 :(得分:0)

package 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;
}

}

答案 4 :(得分:-1)

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);
    }
}