从数组-java中删除素数

时间:2017-07-16 10:32:42

标签: java arrays

如何删除不包括0和1的素数,我想找到不包括0和1的素数?现在如果我有{0,1,3,5,8} ---- >在编译之后,它会找到0和1作为素数。“找到的素数= 0找到的素数=找到1个素数=找到3个素数= 5”这是我的程序: 谢谢你的帮助。

    public static void main(String args[])
    {
        Scanner s=new Scanner(System.in);
        int i,j,size;
        boolean status;
        System.out.print("Enter size of array=");
        size=s.nextInt();
        int arr[]=new int[size];
        int tmp[]=new int[size];
        System.out.println("Enter Elements in array...");
        for(i=0;i<size;i++)
        {
            arr[i]=s.nextInt();
        }
        for( i=0;i<size;i++)
        {
            status=true;
            for(j=2;j<arr[i]-1;j++)
            {
                if(arr[i]%j==0||(arr[i]==0)||arr[i]==1)
                {
                    status=false;
                    tmp[i]=arr[i];
                    break;
                }
            }
            if(status==true)
            {
                System.out.println("Prime Number Found="+arr[i]);
            }
        }

        System.out.println("New Array....");
        for(i=0;i<size;i++)
        {
            System.out.println(tmp[i]);
        }
    }
}

2 个答案:

答案 0 :(得分:1)

您的代码充满了问题,但在下面的代码中我确实解决了以下主要问题:

  • 你没有处理0和1不是正确的基本情况
  • 你的循环扫描可能的整数除数有错误的界限
  • 您没有正确地将找到的素数写入您在main()方法末尾打印的输出数组。

请查看下面的代码,了解您可能要做的事情。

public static void main(String[] args) {
    Scanner s = new Scanner(System.in);
    boolean status;
    System.out.print("Enter size of array=");
    int size = s.nextInt();
    int arr[] = new int[size];
    int tmp[] = new int[size];
    System.out.println("Enter Elements in array...");
    int primerCounter = 0;
    for (int i=0; i < size; i++) {
        arr[i] = s.nextInt();
    }
    for (int i=0; i < size; i++) {
        status = true;
        if (arr[i] == 0 || arr[i] == 1) {
            status = false;
        }
        else {
            for (int j=2; j <= arr[i]-1; j++) {
                if (arr[i] % j ==0) {
                    status = false;
                    break;
                }
            }
        }
        if (status == true) {
            tmp[primerCounter++] = arr[i];
            System.out.println("Prime Number Found="+arr[i]);
        }
    }

    System.out.println("New Array....");
    for (int i=0; i < primerCounter; i++) {
        System.out.println(tmp[i]);
    }
}

对于0到20(含)的数字输入,我得到以下输出:

{2, 3, 5, 7, 11, 13, 17, 19}

答案 1 :(得分:0)

您的问题不是很清楚,但我假设您的问题是您发布的代码将0和1视为素数,而您并不想要这样。如果是这样的话。错误是检查

(arr[i]==0)||arr[i]==1)

在for循环中

for(j=2;j<arr[i]-1;j++)

实际上,当arr [i]等于0或1时,条件

j<arr[i]-1 

将立即计算为false,因为j = 2并且arr [i] -1的计算结果为-1或0.因此,代码

  if(arr[i]%j==0||(arr[i]==0)||arr[i]==1)
  {
      status=false;
      tmp[i]=arr[i];
      break;
  }
永远不会执行

,并且在以下循环中

status==true

将评估为真。

一种解决方案是删除支票

arr[i]==0)||arr[i]==1

从现在的位置开始,如果条件为

,则将其放在同一个位置
status==true
更改== with!=。

简而言之,

if(arr[i]%j==0||(arr[i]==0)||arr[i]==1)
{
     status=false;
     tmp[i]=arr[i];
     break;
}

应该成为

if(arr[i]%j==0)
{
     status=false;
     tmp[i]=arr[i];
     break;
}

 if(status==true)
 {
   System.out.println("Prime Number Found="+arr[i]);
 }

应该成为

 if(status==true || arr[i]!=0 || arr[i]!=1)
 {
   System.out.println("Prime Number Found="+arr[i]);
 }

您发布的代码中还有另一个错误:您使用相同的索引i迭代arr并选择要为其分配值的tmp元素。因为并非arr的每个元素都是素数,因此不会被复制到tmp,这会导致数组tmp带有一些&#34;空洞&#34;,即未分配的元素。您应该将不同的索引k初始化为0以访问tmp的元素并手动递增:

 tmp[k]=arr[i];
 k++;

而不是

 tmp[i]=arr[i];

另外,当你最终迭代tmp时,请记住它的大小不会与arr相同,但是更小(因为我刚才解释过)。因此,

    for(i=0;i<size;i++)
    {
        System.out.println(tmp[i]);
    }

应替换为

    for(i=0; i < actual-size-of-tmp; i++)
    {
        System.out.println(tmp[i]);
    }