Java中的素数测试如何工作?

下面的代码片段检查给定的数字是否为素数。 有人可以向我解释为什么这有效吗? 这段代码是我们为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. "); } } 

整体理论

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

素数的定义是

一个只能被自身整除的数字和1

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

当然,你实际上并不需要一直使用number ,因为number不能被任何超过一半的number整除。

具体部分

循环

此部分运行增加j的值,如果我们假设number = 12,那么它将通过j = 2,3,4,5,6

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

如果声明

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

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

进一步改进

当然你可以进一步改进,因为你实际上需要不高于sqrt(number)但这个片段决定不这样做; 你不需要更高的原因是因为如果(例如)40可以被4整除,它就是4 * 10,你不需要测试4和10.而在这些对中,一个总是低于sqrt(number)

值得注意的是,它们似乎打算将result用作布尔值,但实际上使用整数0和1代表真和假。 这不是好习惯。

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

 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 } 

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

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

isProbablePrime(int certainty)BigInteger类中用于检查给定数字是否为素数的方法。 对于certainty = 1 ,如果BigInteger为prime,则返回true;如果BigInteger为composite,则返回false。

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

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

试试吧

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