Java中的素数测试是如何工作的?
下面的代码片段检查给定的数字是否为素数。有人能给我解释一下为什么会这样吗?这段代码在Java考试的学习指南中Java中的素数测试是如何工作的?,java,primes,number-theory,Java,Primes,Number Theory,下面的代码片段检查给定的数字是否为素数。有人能给我解释一下为什么会这样吗?这段代码在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: ");
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. ");
}
}
publicstaticvoidmain(字符串[]args)
{
int j=2;
int结果=0;
整数=0;
扫描仪阅读器=新扫描仪(System.in);
System.out.println(“请输入一个数字:”);
number=reader.nextInt();
而(j)总体理论
条件if(number%j==0)
询问number
是否可被j
整除
素数的定义是
一个只能被自身和1整除的数
所以,若你们测试了2和数之间的所有数,并且它们都不是完全可除的,那个么它就是素数,否则就不是
当然,实际上你不必一直到数字
,因为数字
不能被任何超过一半的数字
整除
特定章节
While循环
本节通过增加j的值运行,如果我们假设number
=12,那么它将通过j
=2,3,4,5,6运行
int j = 2;
.....
while (j <= number / 2)
{
........
j++;
}
进一步改进
当然,您可以进一步改进这一点,因为您实际上不需要比sqrt(number)
更高,但此代码段决定不这样做;您不需要更高的原因是因为如果(例如)40正好可以被4整除,它是4*10,你不需要同时测试4和10。在这些对中,有一对总是低于sqrt(number)
还值得注意的是,他们似乎打算将结果
用作布尔值,但实际上使用整数0和1来表示true和false。这不是一个好做法。它通过迭代输入的2到一半之间的所有数字来工作(因为任何数字都大于输入/2)如果输入的数字除以j
得到0余数(如果(数字%j==0)
)然后,输入的数字可以被除1或其本身以外的数字整除。在这种情况下,结果设置为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
}
int j=2;//变量
int result=0;//变量
int number=0;//变量
扫描仪阅读器=新扫描仪(System.in);//扫描仪对象
System.out.println(“请输入一个数字:”;//说明
number=reader.nextInt();//获取输入的数字
而(j一定要尝试
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;
}
}
公共类回文素数{
私有静态int g,k,n=0,i,m;
静态字符串b=“”;
专用静态扫描仪=新扫描仪(System.in);
公共静态void main(字符串[]args)引发IOException{
系统输出打印(“请输入数据:”);
g=scanner.nextInt();
系统输出打印(“请输入数据2:”);
m=scanner.nextInt();
计数(g,m);
}
//
//********************************************************************************
私有静态整数计数(整数L,整数R)
对于(i=L;i=1;n--){
如果(i%n==0){
计数=计数+1;
}
}
如果(计数=2)
{
b=b+i+“”;
}
}
系统输出打印(“数据:”);
系统输出打印(“数据:\n”+b);
返回R;
}
}
Java.math.biginger类包含一个方法isProbablePrime(int确定性)来检查数字的素性
isProbablePrime(int确定性)
:在BigInteger
类中检查给定数字是否为素数的方法。
对于确定性=1
,如果biginger
为素数,则返回true;如果biginger
为复合数,则返回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;
}
}
输出:83为基本值:真
有关更多信息,请参阅我的。你从哪里得不到?素数的定义是什么;一个只能被自身整除的数字,1你不明白的部分是什么?我需要确切地知道该解释什么……为什么它不起作用?@AdamStaples哇,你甚至不能直接阅读代码。“如果这个模等于1”?它检查mod是否等于0,即j除以该数字。好的,我知道一个数字p是素数,当且仅当唯一除以它的数字是p和1本身。在本例中,尽管用户输入了一个数字,比如k。然后它测试k/2是否大于或等于2(因为我们不想检查1&2.2是否自动为素数,1既不是素数也不是复合数)。然后需要k mod(j=2),Idk我只是很难理解代码。我知道素数之类的东西,我做过很多数论。不过我想我读java代码的能力很差。@AdamStaples这些变量名p和k来自哪里,除非我们坚持问题中的变量名,否则疯狂会随之而来。我假设k是number
@AdamStaples j++;增加j的值,循环将在2,3,4,5,6,…number/2-1,number/2Oh测试j。我现在觉得自己像个白痴。因为这是一个while循环,它将迭代所有的选择,直到while循环的布尔值为“true”。因为它只检查number/2次,它永远不会达到j=number,因此如果prime永远不会与Utent等于0 mod j,因此nuver等于“1”。如果我说得通的话,可以Idk,但我完全明白它为什么会起作用。好的,谢谢!如果你也在代码之外用简单的英语给出解释,这个答案可以大大改进。
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;
}
}