当前位置: 首页 > 知识库问答 >
问题:

这个素数测试在Java中是如何工作的?

尚恩
2023-03-14

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

共有3个答案

史景铄
2023-03-14

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

苏俊友
2023-03-14

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

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
}    
莫欣悦
2023-03-14

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

素数的定义是

只能被本身和1整除的数

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

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

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

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

本节将结果设置为1,前提是在任何点上数字可被j整除<代码>结果一旦设置为1,就永远不会重置为0。

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

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

还值得注意的是,他们似乎打算将结果用作布尔值,但实际上使用了整数0和1来表示true和false。这不是好的做法。

 类似资料:
  • 问题内容: 下面的代码段检查给定数字是否为质数。有人可以向我解释为什么这行得通吗?该代码在为Java考试提供给我们的学习指南中。 问题答案: 整体理论 条件询问是否可以被整除 素数的定义是 一个只能被自己和1整除的数字 因此,如果您测试2到number之间的所有数字,并且没有一个数字能被整除,则它是质数,否则就不是质数。 当然,您实际上不必一路前进,因为不能被一半以上的东西完全整除。 具体章节 W

  • 这是来自SQLZOO.NET的问题

  • 我试图了解mysql查询在GROUP BY和不使用GROUP BY的情况下是如何工作的。 假设我有一个FILM_ACTORS表,其中每个ACTOR_ID都有一个相应的film_id。于是同一个演员参演了N部不同的电影。 我想选出参与20部电影的演员: 这个查询起作用,并返回参与20部电影的actor_id。但如果我只是: 为什么该查询仅在我将其等于film_actor表(5463)的大小时才返回值

  • Kotlin定义了自己的类: 该类的实例是通过中定义的内联函数构造的: null 我认为在编译之前必须进行某种代码预处理。 请随意用一个更贴切的标题编辑这个问题。

  • 我经常把文本输出到文件中。我想知道:是如何工作的? 当我调用时,它是否在文件上写入文本?如果它不写文本,我需要使用flush函数来写数据吗? 例如: 如果while循环中发生错误,文件将在不写入数据的情况下关闭。如果我在while循环中使用函数,那么为什么要使用?如果我错了,请纠正我。

  • 我正在阅读《实用恶意软件分析》一书,其中出现了以下示例代码: 作者接着说: 返回的COM对象将存储在堆栈中IDA Pro标记为ppv的变量中,如图所示。 我的问题是,这是为什么?既然我们做了一个mov eax,[esp 24h ppv],这难道不是将[esp 24h ppv]内部的数据移动到eax并覆盖返回值,而不是将返回值存储在变量中吗?我认为在Intel格式中,mov操作数1、操作数2总是将第