9

下面的代码片段检查给定数字是否为质数。有人可以向我解释为什么会这样吗?这段代码在给我们的 Java 考试学习指南中。

public static void main(String[] args)
{    
    int j = 2;
    int result = 0;
    int number = 0;
    Scanner reader = new Scanner(System.in);
    System.out.println("Please enter a number: ");
    number = reader.nextInt();
    while (j <= number / 2)
    {
        if (number % j == 0)
        {
           result = 1;
        }
        j++;
    }
    if (result == 1)
    {
        System.out.println("Number: " + number + " is Not Prime.");
    }
    else
    {
        System.out.println("Number: " + number + " is Prime. ");
    }
}
4

5 回答 5

25

总体理论

条件if (number % j == 0)询问是否number可以被整除j

素数的定义是

一个只能被它自己和 1 整除的数

因此,如果您测试 2 和数字之间的所有数字,并且它们都不是完全可分的,那么它是素数,否则不是。

当然,您实际上不必一直走到number,因为number不能被任何超过 half 的东西完全整除number

具体部分

While 循环

本节贯穿增加 j 的值,如果我们假设number= 12 那么它将贯穿j= 2,3,4,5,6

  int j = 2;
  .....
  while (j <= number / 2)
  {
      ........
      j++;
  }

如果语句

result如果在任何一点number都可以被 整除,则此部分设置为 1 j。一旦设置为 1,就result永远不会重置为 0。

  ......
  if (number % j == 0)
  {
     result = 1;
  }
  .....

进一步改进

当然,您可以进一步改进它,因为您实际上需要不高于sqrt(number)但此代码段已决定不这样做;你不需要更高的原因是因为如果(例如)40 可以被 4 整除,那么它是 4*10,你不需要同时测试 4 和 10。在这些对中,一对总是低于sqrt(number)

还值得注意的是,它们似乎打算result用作布尔值,但实际上使用整数 0 和 1 来表示真假。这不是好的做法。

于 2013-10-22T10:05:44.817 回答
7

我试图评论每一行来解释正在进行的过程,希望它有所帮助!

int j = 2;   //variable
int result = 0; //variable
int number = 0; //variable
Scanner reader = new Scanner(System.in); //Scanner object
System.out.println("Please enter a number: "); //Instruction
number = reader.nextInt(); //Get the number entered
while (j <= number / 2) //start loop, during loop j will become each number between 2 and 
{                             //the entered number divided by 2
    if (number % j == 0) //If their is no remainder from your number divided by j...
    {
        result = 1;  //Then result is set to 1 as the number divides equally by another number, hergo
    }                //it is not a prime number
    j++;  //Increment j to the next number to test against the number you entered
}
if (result == 1)  //check the result from the loop
{
    System.out.println("Number: " + number + " is Not Prime."); //If result 1 then a prime   
}
else
{
    System.out.println("Number: " + number + " is Prime. "); //If result is not 1 it's not a prime
}    
于 2013-10-22T10:11:15.320 回答
3

它通过迭代 2 到输入数字的一半之间的所有数字来工作(因为任何大于输入/2(但小于输入)的数字都会产生一个分数)。如果输入的数字除以j余数为 0 ( if (number % j == 0)),则输入的数字可以被除 1 以外的数字或其自身整除。在这种情况下,结果设置为 1,并且该数字不是质数。

于 2013-10-22T10:09:17.030 回答
2

Java java.math.BigInteger 类包含一个方法isProbablePrime(int certainty)来检查数字的素数。

isProbablePrime(int certainty)BigInteger类中检查给定数字是否为素数的方法。对于,如果是素数certainty = 1则返回真,如果是合数则返回假。BigIntegerBigInteger

Miller-Rabin素数算法用于检查该方法中的素数。

import java.math.BigInteger;

public class TestPrime {

    public static void main(String[] args) {
        int number = 83;
        boolean isPrime = testPrime(number);
        System.out.println(number + " is prime : " + isPrime);

    }

    /**
     * method to test primality
     * @param number
     * @return boolean
     */
    private static boolean testPrime(int number) {
        BigInteger bValue = BigInteger.valueOf(number);

        /**
         * isProbablePrime method used to check primality. 
         * */
        boolean result = bValue.isProbablePrime(1);

        return result;
    }
}

Output: 83 is prime : true

有关更多信息,请参阅我的博客

于 2016-05-04T05:03:54.323 回答
-2

试试看

public class PalindromePrime   {
     private static int g ,k ,n =0,i,m ; 

     static String b ="";
    private static Scanner scanner = new Scanner( System.in );

    public static void main(String [] args) throws IOException {

        System.out.print(" Please Inter Data : "); 
        g = scanner.nextInt();  

        System.out.print(" Please Inter Data 2  : "); 
        m = scanner.nextInt();

        count(g,m);


        }

//      
        //********************************************************************************    


    private static    int count(int L, int R) 

        for( i= L ; i<= R ;i++){
            int count = 0 ;
            for( n = i ; n >=1 ;n -- ){

                if(i%n==0){

                    count = count + 1 ;
                }           
            }
            if(count == 2)
            {       
                b = b +i + "" ; 
            }   

        }

        System.out.print("  Data  : "); 
        System.out.print("  Data : \n "  +b );  

        return R;

        }
} 
于 2016-01-07T04:09:24.327 回答