Java 使用模运算符获取素数
您将如何修改以下内容以打印出1-100之间的所有素数?下面有一个问题,数字2返回为非素数。数字2满足if(i%number==0)条件,因为2%2返回为0Java 使用模运算符获取素数,java,Java,您将如何修改以下内容以打印出1-100之间的所有素数?下面有一个问题,数字2返回为非素数。数字2满足if(i%number==0)条件,因为2%2返回为0 public class Test { /** * @param args */ public static void main(String[] args) { for(int i=1; i<=100; i++){ if(isPrime(i)){
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
for(int i=1; i<=100; i++){
if(isPrime(i)){
System.out.println(i + " is a prime number");
}else{
System.out.println(i + " is not a prime number");
}
}
}
public static boolean isPrime(int number){
for(int i=2; i<=number; i++){
if(i%number == 0){
return false;
}else{
return true;
}
}
return false;
}
}
公共类测试{
/**
*@param args
*/
公共静态void main(字符串[]args){
对于(int i=1;i
一旦找到一个不可整除的数字,就返回true,即使它以后确实有因子。请尝试此方法
public static boolean isPrime(int number) {
for(int i = 2; i * i <= number; i++) {
if (i % number == 0) {
return false;
} else {
return true;
}
}
return true;
}
public静态布尔值isPrime(整数){
对于(int i=2;i*i,这里有几个问题。首先,当检查一个数字是否为素数时,千万不要检查每个数字是否与被检查的素数相等。检查所有素数的平方根就足够了
要修复该错误,请查看for循环条件并相应地进行编辑:
for(int i=2; i<=number; i++)
如果此条件变为else语句,即使有一次它将返回true,则需要确保只有在选中所有要返回的数字后才返回true
此外,我认为你没有仔细考虑过你的基本情况是什么。你最后一行的意思是,如果之前的所有东西都漏掉了,那么它应该假设这个数字不是素数。想想看,我肯定你能找到它。特别指出,一个不能是素数。
这意味着,isPrime(1)
应该返回false。您的实现会返回false
但是isPrime(2)
应该返回true。您的实现不会返回true。这不是因为(2%2==0)
并且您正在检查从2到N的所有数字,而不是从2到N-1的所有数字。最后一个数字N将始终产生零余数(N%N==0)
处理素数时需要考虑的几件事。在开始时,2可以有一个特例(例如,类似于if(number==2)
…)
除了你一直检查到i的错误之外,这将起作用。2是测试素数时的一个特例。如果你开始搜索越来越大的…你可能想看看埃拉托芬的筛子
每个素数都是另一个数的倍数。以3为例。使用筛子,如果你发现3是素数,那么它将“忽略”所有3的倍数,从而减少找到后续素数所需的时间。它会加快速度…很多:)
公共类JavaApplication47{
公共静态void main(字符串[]args){
对于(inti=1;i,这里有一个确定一个数字是否为素数的算法
- 数字是否小于2?如果是,则返回false
- 数字是2还是3?如果是,则返回true
- 数字是4吗?如果是,则返回false
- 取数字的平方根,四舍五入到下一个整数。这对于小素数是可选的,但对于较大的数,这会加快确定速度
- 从5循环到数字(或数字)的平方根,递增2。
- 将循环数除以到目前为止确定的素数
- 如果除法的模数为零,则返回false
- 如果循环完成,则返回true
你问这到底是为什么?你尝试了什么,什么不起作用?你在iPrime中的for循环被破坏了。它总是在第一次迭代中返回。另外,请调试我的代码问题通常不适用于此网站。@ClassicThunder他问为什么它不能按预期工作(因此逻辑错误在哪里)。对我来说,这似乎是一个完全合法的问题。这个问题是关于逻辑的,这一事实并不意味着可以问“请为我调试以下代码”问题。可能的重复代码可以用return false;
;)替换所有代码。)修正打字错误。虽然这是一个答案,但你正在做OP的工作。参考@LuiggiMendoza不知道这是作业,将编辑为不太容易出问题不难意识到这是作业(我怀疑你在工作中解决了这类问题)@LuiggiMendoza是的,可能应该抓到它,但这是一个漫长的一天。更新为更多的反馈和更少的分发。请不要尝试这个…它也坏了。请在发布这些答案之前参考(同时,你也可以查看你发布的内容)我知道旧线程,但这是从哪里来的?有来源吗?我差不多七年前写过这篇文章,所以如果有来源,我不记得了。平方根技巧非常常见。你也可以将for循环增加2,避免除以2的测试。
public static boolean isPrime(int number) {
for(int i = 2; i * i <= number; i++) {
if (i % number == 0) {
return false;
} else {
return true;
}
}
return true;
}
for(int i=2; i<=number; i++)
if (i%number == 0) {
return false;
} else {
return true;
}
public class JavaApplication47 {
public static void main(String[] args) {
for(int i=1; i<=100; i++){
if(isPrime(i)){
System.out.println(i + " is a prime number");
}else{
// System.out.println(i + " is not a prime number");
}
}
}
public static boolean isPrime(int n) {
for(int i=2; 2*i<n; i++) {
if(n%i==0)
return false;
}
return true;
}
}
static boolean [] allPrimes = new boolean[10000];
public static void fillTheSieve(){
Arrays.fill(allPrimes, true);
allPrimes[0] = allPrimes[1] = false; //1 and 0 are false. winning
for (int i = 2; i < allPrimes.length; i++) {
//check if prime, if so getmultiples and declae false
if(allPrimes[i]){
for (int j = 2; i*j<allPrimes.length; j++) {
allPrimes[i*j] = false;
}
}
}
}