打印素数的程序逻辑

时间:2013-06-29 08:55:44

标签: java

任何人都可以帮助理解这个java程序吗?

它只是打印素数,当你输入你想要的数量时它就能正常工作。

class PrimeNumbers
{      
     public static void main(String args[])       
     {         
       int n, status = 1, num = 3;             
       Scanner in = new Scanner(System.in);

       System.out.println("Enter the number of prime numbers you want");         
       n = in.nextInt();

       if (n >= 1)
       {
         System.out.println("First "+n+" prime numbers are :-");
         System.out.println(2);
       }

       for ( int count = 2 ; count <=n ;  )
       {
         for ( int j = 2 ; j <= Math.sqrt(num) ; j++ )
         {
            if ( num%j == 0 )
            {
               status = 0;
               break;
            }
         }
         if ( status != 0 )
         {
            System.out.println(num);
            count++;
         }
         status = 1;
         num++;
      }         
   }
}

对于循环条件我不明白这个

for ( int j = 2 ; j <= Math.sqrt(num) ; j++ )

为什么我们采用sqrt的num ...这是3 ....为什么我们假设它为3?

7 个答案:

答案 0 :(得分:2)

想象一下,n可以除以大于k的数字sqrt(n)。然后你有:

n = k * j

其中j是一个必须小于sqrt(n)的数字(如果kj都大于sqrt(n)那么他们的产品会更大比n)。

所以你只需要找到小于或等于sqrt(n)的除数,你可以通过一个简单的除法找到大于或等于sqrt(n)的除数。在我的示例中,找到j后,您可以找到k = n / j

答案 1 :(得分:1)

有问题的线基本上是试图找到你给定数字因子的数字(并将它们作为非素数消除)。如果您没有找到给定数字的因子,那么您可以说该数字是素数。

就发现因素而言,你只需要达到sqrt(N),因为如果你走得更高,你会看到你以前见过的数字。这是因为每次找到一个因素,你实际上找到了两个因素。如果a是N的因子,那么N / a和a都是N的因子。

答案 2 :(得分:0)

如果满足N = A * B的唯一整数为1且N(或N和1),则数字N为素数。

现在检查数字N为素数,我们可以搜索从2到N的所有A,从2到N搜索B,看看N = A * B.这将花费O(N ^ 2)时间,并且效率非常低。

事实证明,我们只需要将N除以一个数字,看看是否有余数。这将其归结为O(N)。

此外,我们不需要检查从A = 2到A = N的所有方式。如果A大于sqrt(N),则B必须小于sqrt(N)。因此,我们只需要检查A从2到sqrt(N)以查看N / A是否有余数。

答案 3 :(得分:0)

如果我是对的,那么在数学中有一个理论,说几乎所有质数都可以在检查从2到2的平方根的数字时确定,而不是检查从2到2或2到n / 2的所有数字。

答案 4 :(得分:0)

数字因子只能从1到sqrt的num。因此,我们不会检查从1到num的因子,而是检查从1到sqrt(num)的所有数字,看看是否有任何数字除以num。如果有任何除数num,它不是素数,否则它是。这提高了代码的效率。

答案 5 :(得分:0)

快速但又脏的解决方案..

import java.util.Scanner;

class testing
{
    public static void main(String args[])
    {
        Scanner input = new Scanner(System.in);
        int n, i, j, count = 1;
        System.out.print("How many Numbers ? : ");
        n = input.nextInt();
        for(j = 1;count<=n;j++)
        {

            if(j==1 || j==2)
            {
                System.out.println(j);
                count++;
                continue;
            }
            for(i=2;i<=j/2;i++)
            {
                if(j%i==0)
                    break;
                else if(i == j/2 && j%i != 0)
                {
                    System.out.println(j);
                    count++;
                }  
            }
        }       
    }
}

答案 6 :(得分:-1)

public class PrimeNumber {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    ArrayList a = new ArrayList();
    for (int i = 1; i <= 100; ++i) {
        if (isPrime(i))
            a.add(i);
    }
    System.out.println("List : " + a);

}

public static boolean isPrime(int value) {
    if (value <= 1)
        return false;


    if ((value % 2) == 0)
        return (value == 2);

    for (int i = 3; i <= value - 1; i++) {
        if (value % i == 0) {
            return false;             
        }
    }     

    return true;
}

}