Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的素数测试是如何工作的?_Java_Primes_Number Theory - Fatal编程技术网

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: ");

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