【问题标题】:How does this prime number test in Java work?Java 中的这个素数测试是如何工作的?
【发布时间】:2013-10-31 03:14:36
【问题描述】:

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

【问题讨论】:

  • 你没找到?
  • 素数的定义是什么?一个只能被它自己和 1 整除的数
  • 你不明白的部分是什么?我需要确切地知道要解释什么..
  • 为什么它不起作用
  • @AdamStaples 哇,您甚至无法直接阅读代码。 “如果那个 mod 等于 1”?它检查mod是否等于0,即j除数。

标签: java primes number-theory


【解决方案1】:

总体理论

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

素数的定义是

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

因此,如果您测试 2 和 number 之间的所有数字,并且它们都不能完全整除,那么它是质数,否则不是。

当然,您实际上不必一直走到number,因为number 不能被任何超过一半的number 整除。

具体部分

While循环

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

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

如果语句

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

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

进一步改进

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

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

【讨论】:

  • 好吧,我知道一个数 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/2 处测试 j
  • 哦,我现在觉得自己像个白痴。因为它是一个 while 循环,所以它将遍历所有选择,直到 while 循环的布尔值为“真”。由于它只检查 number/2 次,它永远不会达到 j = number,因此如果素数永远不会与 0 mod j 一致,因此 nuver 等于“1”。好吧,Idk,如果我有任何意义,但我完全明白它为什么有效。好的,谢谢!
【解决方案2】:

我已尝试对每一行进行评论以解释正在进行的过程,希望对您有所帮助!

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
}    

【讨论】:

  • 如果您还用简单的英语在代码之外给出解释,这个答案可以大大改善。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

    该方法使用米勒-拉宾素数算法来检查素数。

    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

    【讨论】:

      【解决方案5】:

      试试看

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

      【讨论】:

        猜你喜欢
        • 2013-10-29
        • 2020-12-28
        • 1970-01-01
        • 2020-11-12
        • 2015-06-19
        • 1970-01-01
        • 1970-01-01
        • 2021-01-16
        • 1970-01-01
        相关资源
        最近更新 更多