我正在尝试更熟悉Java,因此针对以下问题尝试我自己的逻辑打印前100个正整数中存在的所有素数 ......
import java.io.IOException;
class PrimeNumbers{
public static void main(String[] args) throws IOException
{
int[] num=new int[101]; //array to store values from 1 to 100
int[] prime=new int[50]; //array to store prime numbers
for(int i=1;i<=100;i++)
num[i]=i; //add values from 1 to 100 to "num" array
int i=1; //index for "num" array
int j=0; //index for "prime" array
int chk; //temporary variable to store value from "num" to carry out all "checking operations"
while(i<=100)
{
chk=num[i];
if(chk==1)
{
prime[j++]=chk;
i++;
break;
}
else if(chk==2)
{
i++;
break;
}
else if(chk==3)
{
prime[j++]=chk; //increment i and j after adding the "chk" value to "prime" array
i++;
break;
}
else if((chk % 2)!=0 && (chk % 3)!=0) //if number is divisible by 2 or 3,no need to check further
{
int k=4;
while(k<((chk+1)/2)) //check if value of "k" is less than half of "chk" value
{
if(chk%k!=0) k++; //increment "k" from 4 to half of chk's value and check if any of them is divisible
}
prime[j++]=chk;
i++;
break;
}
else
i++;
}
for(int n=0;n<prime.length;n++)
System.out.print(prime[n]+" "); //print the output
}
}
问题是我没有收到任何错误,但输出不是我预期的,我已经尝试了3个多小时才弄明白这个问题,但没有运气..
任何帮助将不胜感激,谢谢!
输出 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
编辑: 具有类似逻辑的更正版本
import java.io.IOException;
class PrimeNumbers{
public static void main(String[] args) throws IOException
{
int[] prime=new int[50]; //array to store prime numbers
int i=1;
int j=0; //index for "prime" array
int chk; //temporary variable to store value i to carry out all "checking operations"
while(i<=100)
{
chk=i;
if(chk==1)
{
i++;
}
else if(chk==2)
{
prime[j++]=chk; //increment i and j after adding the "chk" value to "prime" array
i++;
}
else if(chk==3)
{
prime[j++]=chk; //increment i and j after adding the "chk" value to "prime" array
i++;
}
else if((chk % 2)!=0 && (chk % 3)!=0) //if number is divisible by 2 or 3,no need to check further
{
int k=5;
boolean flag=false;
while(k<(chk/2) && k<50) //check if value of "k" is less than half of "chk" value
{
if(chk%k!=0)
{
k++; //increment "k" from 4 to half of chk's value and check if any of them is divisible
}
else
{
flag=true;
break;
}
}
if(!flag)
{
prime[j++]=chk;
}
i++;
}
else
{
i++;
}
}
for(int n=0;n<prime.length;n++)
if(prime[n]!=0)
System.out.print(prime[n]+" "); //print the output
}
}
输出: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
答案 0 :(得分:3)
break
块中的 if
语句将中断while
循环。因此,请删除break
循环中的所有while
语句。
答案 1 :(得分:1)
当你将1放在素数列表中时,你会突破循环:
if(chk==1)
{
prime[j++]=chk;
i++;
break;
}
删除(其他类似的)休息。
答案 2 :(得分:1)
你的休息;声明是问题所在。
else if((chk % 2)!=0 && (chk % 3)!=0) //if number is divisible by 2 or 3,no need to check further
{
int k=4;
while(k<((chk+1)/2)) //check if value of "k" is less than half of "chk" value
{
if(chk%k!=0) k++; //increment "k" from 4 to half of chk's value and check if any of them is divisible
}
prime[j++]=chk;
i++;
break; //here is the problem. you are breaking the outer loop
}
答案 3 :(得分:1)
您不需要数组。有一种更简单的方法。
运行一个数字循环(x),在其中运行另一个循环,从2到x(y)的一半。如果x可被y整除,则它不是素数。
答案 4 :(得分:1)
从if块中删除break
,因为Break语句完成while循环的执行
跟踪i=0
,
while(i<=100)
{
chk=num[i]; // In num array num[i] = i, as assigned by you, so chk =1
if(chk==1) //chk==1 is true
{
prime[j++]=chk; // j++ = 0 and then ++ ,so prime[0] = 1
i++;
break; // here your execution of while block finishes because of break
}
else if(chk==2){
i++;
break;
}
.............
}
for for循环第一个值,prime[0] is 1
,all values in prime is
zero
除外。
for(int n=0;n<prime.length;n++)
System.out.print(prime[n]+" "); // prime[0] = 1 & all other is zero.
那就是为什么你会得到如此荒谬的输出
Use continue & not break
答案 5 :(得分:1)
你的程序根本没有实现素数算法。
除了将1计为素数而不是2之外,代码的核心是:
else if( something irrelevant ) {
int k=4;
while( something ) {
if(chk%k!=0) k++;
}
prime[j++]=chk;
i++;
break;
}
只是指出两个严重的问题,而没有注意到其他问题:
你会花很多时间在while循环中计算k
。
这个while循环可能永远不会终止,即chk%k == 0
时。
但是,在冒着你的程序永远运行风险之后,你甚至不使用k
!
相反,您只需将chk
作为素数。
这显然是错误的。
答案 6 :(得分:1)
首先删除中断,它们会让你退出while循环并删除1的检查(它既不是主流也不是复合主流)
要简单地理解你的逻辑,你需要检查这个数字是否可以被2个数字整除[ LOGIC :素数可以被1整除]如果是这样的话,你可以跳过这个数字而不是素数,继续下一个。
因此,如果条件“else if((chk % 2)!=0 && (chk % 3)!=0)
”成为
else if((chk % 2)!=0 && (chk % 3)!=0)
{
int k=4;
int flag=1;
while((k<((chk+1)/2))) //check if value of "k" is less than half of "chk" value
{
if(chk%k==0)
flag++;
k++; //increment "k" from 4 to half of chk's value and check if any of them is divisible
}
if(flag<2)
prime[j++]=chk;
i++;
// break;
}
3.只想到这个逻辑
所有可被2整除的数字都不是素数,因此您可以将数字增加2
如果一个数字不能被素数整除,那么它就是一个素数
试试这段代码
public static void main(String[] args) throws IOException
{
int[] prime=new int[50]; //array to store prime numbers within 1-n prime numbers will be <=n/2
int i=1; //index for "num" array
int j=1; //index for storing to "prime" array
int k=1; //index for browsing through prime array
prime[0]=2; // setting the first element
int flag=1; // to check if a number is divisibe for than 2 times
for(i=3;i<=100;i+=2) {
for(k=0;prime[k]!=0;k++) //browsing through the array to till non zero number is encountered
{
if(i%prime[k]==0) flag++; //checking if the number is divisible, if so the flag is incremented
}
if(flag<2)
{
prime[j++]=i; // if the flag is still 1 then the number is a prime number
}
flag=1;
}
System.out.println(Arrays.toString(prime)); //a short way to print an array
}