下面的代码片段会检查给定的数字是否为素数。有人可以向我解释为什么这有效吗?这段代码是我们为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. ");
}
}
答案 0 :(得分:25)
条件if (number % j == 0)
询问number
是否可以被j
整除
素数的定义是
一个只能被自身整除的数字和1
所以如果你测试2和数字之间的所有数字,并且它们都不是完全可分的那么它就是素数,否则就不是。
当然,您实际上不必一直走到number
,因为number
无法被半数number
以上的任何内容完全整除。
如果我们假装number
= 12那么它将通过j
= 2,3,4,5,6
int j = 2;
.....
while (j <= number / 2)
{
........
j++;
}
如果result
完全可以被number
整除,则此部分会将j
设置为1。一旦设置为1,result
永远不会重置。
......
if (number % j == 0)
{
result = 1;
}
.....
当然,你可以进一步改进,因为你实际上需要不高于sqrt(number)
,但这个片段决定不这样做;你不需要更高的原因是因为如果(例如)40可以被4整除,它就是4 * 10,你不需要测试4和10.并且这些对中的一个总是低于{{ 1}}。
值得注意的是,他们似乎打算使用sqrt(number)
作为布尔值,但实际上使用整数0和1代表真和假。这不是一个好习惯。
答案 1 :(得分: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
}
答案 2 :(得分:3)
它通过迭代输入数字的2到一半之间的所有数字来工作(因为任何大于输入/ 2的数字(但小于输入)将产生一个分数)。如果输入的数字除以j
得到0余数(if (number % j == 0)
),则输入的数字可被1除以外的数字或其自身整除。在这种情况下,结果设置为1,并且数字不是素数。
答案 3 :(得分:2)
Java java.math.BigInteger类包含一个方法 isProbablePrime(int certainty)来检查数字的素数。
isProbablePrime(int certainty)
:BigInteger
类中用于检查给定数字是否为素数的方法。
对于certainty = 1
,如果BigInteger
为素数则返回true,如果BigInteger
为复合则返回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
有关详细信息,请参阅我的blog。
答案 4 :(得分:-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;
}
}