Java 无法理解测试数字是否为素数背后的逻辑 /** *isPrime方法迭代1-100范围内的每个数字,并将每个素数添加到 用户创建的文件中的列表 *@param filename将数字添加到的文件 */ 公共静态void isPrime(字符串文件名)引发IOException { boolean status=true;//告诉方法数字是否为素数(如果status=true,数字为素数) //打开以前创建的文件进行写入 FileWriter fwriter=新的FileWriter(文件名,true); PrintWriter outputFile=新的PrintWriter(fwriter); 对于(int i=1;i

Java 无法理解测试数字是否为素数背后的逻辑 /** *isPrime方法迭代1-100范围内的每个数字,并将每个素数添加到 用户创建的文件中的列表 *@param filename将数字添加到的文件 */ 公共静态void isPrime(字符串文件名)引发IOException { boolean status=true;//告诉方法数字是否为素数(如果status=true,数字为素数) //打开以前创建的文件进行写入 FileWriter fwriter=新的FileWriter(文件名,true); PrintWriter outputFile=新的PrintWriter(fwriter); 对于(int i=1;i,java,Java,而言,%运算符是余数运算符。它从2到num进行交互,以查看素数是否可以被这些数字中的任何一个整除。一旦可以,它就不能是素数,因此返回false。如果完成且没有整除符,则返回true 但是有一种更有效的方法。只需将候选编号num除以以2开头的值,直到num的平方根。想想看,如果到那时为止没有余数,那么从num到num的平方根的任何其他数字都不会将其除掉 因此,首先通过2检查整除性。然后从3开始,仅通过奇数 所以这个方法看起来是这样的 /** * The isPrime method iterat

而言,%运算符是余数运算符。它从2到
num
进行交互,以查看素数是否可以被这些数字中的任何一个整除。一旦可以,它就不能是素数,因此返回false。如果完成且没有整除符,则返回true

但是有一种更有效的方法。只需将候选编号
num
除以以
2
开头的值,直到
num
的平方根。想想看,如果到那时为止没有余数,那么从
num
num
的平方根的任何其他数字都不会将其除掉

因此,首先通过
2
检查整除性。然后从
3
开始,仅通过奇数

所以这个方法看起来是这样的

/**
 * The isPrime method iterates through every number in the range of 1 - 100 and adds every prime number to a 
   list in the file created by the user
 * @param filename The file that numbers will be added to
 */

public static void isPrime(String filename) throws IOException
{
   boolean status = true;          // tells method if number is prime or not (if status = true, number is prime)

   // opens up previously-created file for writing
   FileWriter fwriter = new FileWriter(filename, true);
   PrintWriter outputFile = new PrintWriter(fwriter);

   for (int i = 1; i <= 100; i++)
   {
       // check if each number is prime 
        status = checkPrime(i);

        if (status == true && i != 1)
        {
            outputFile.println(i);
        }
   }

   outputFile.close();
}

/**
 * The checkPrime method tests each number passed in as a parameter to see if it is prime
 * @param num Integer to be tested
 * @return Returns a boolean value of either true or false
 */

public static boolean checkPrime(int num)
{
    int remainder;              // used to test whether number is prime or not

    for (int j = 2; j < num; j++)
    {
        remainder = num % j;
        if (remainder == 0)
        {
            return false;
        }
    }
    return true;
}
公共静态布尔校验素数(int num)
{
int余数;//用于测试数字是否为素数
如果(数值%2==0){
返回false;
}          
对于(int j=3;j<(int)Math.sqrt(num)+1;j+=2)
{
余数=num%j;
如果(余数==0)
{
返回false;
}
}
返回true;
}

根据定义,素数是一个只能被1或自身整除的数。要使一个数可以整除,除的余数应该是0

示例

5是素数,因为它只能被自身和1整除:

  • 5/5=1余数0
  • 5/4=1余数1
  • 5/3=1余数2
  • 5/2=2余数1
  • 5/1=5余数0
而4不是素数,因为它也可以被2整除:

  • 4/4=1余数0
  • 4/3=2余数1
  • 4/2=2余数0
  • 4/1=4余数0
运算符
%
用于计算余数
5%2=1


使用此运算符,我们可以循环遍历
2
num
for(int j=2;j
(我们不想检查
1
num
本身),并检查
余数
如果(余数==0)
。一旦
余数
等于
0
,循环就会中断,返回
false
,这意味着数字是非素数。否则,循环结束,方法返回
true
表示数字是素数,这是一个非常模糊的问题,因为我们不知道现在你已经知道了。就目前的情况而言,你基本上是要求我们在一个答案中教你Java的所有基础知识。你可以通过缩小你不了解的内容来极大地改进这个问题。包括你研究过的任何内容,并解释你认为每一行都做了什么。然后我们就有了一些东西要处理。事实上,所有人都是这样我知道,我需要解释每个键在键盘上的位置。checkPrime()是一种判断数字是否为素数的低效方法。它从2循环到数字,并检查整数除法后的余数(
rements=num%j;
)是零。如果是这样,它将返回false。否则,如果它经过整个循环,它将返回true,因为数字是素数。对于这种模糊性,很抱歉,有两件事让我感到困惑:第一件事,我对第二个循环的工作方式感到困惑,但我现在明白了。我现在唯一不明白的是如何重新编写它,使其不包含1作为prime数字,而不只是将不包含1作为一个条件,如果这有任何意义的话
public static boolean checkPrime(int num)
{
    int remainder;              // used to test whether number is prime or not
    if(num % 2 == 0) {
         return false;
    }          
    for (int j = 3; j < (int)Math.sqrt(num)+1; j+=2)
    {
        remainder = num % j;
        if (remainder == 0)
        {
            return false;
        }
    }
    return true;
}