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
而言,%运算符是余数运算符。它从2到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
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/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;
}