尝试查找素数时出现意外输出 - Java

时间:2013-10-23 10:20:46

标签: java

我正在尝试更熟悉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

7 个答案:

答案 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 1all 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)

  1. 首先删除中断,它们会让你退出while循环并删除1的检查(它既不是主流也不是复合主流)

  2. 要简单地理解你的逻辑,你需要检查这个数字是否可以被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. 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
            }