2017-07-16 42 views
-3

如何刪除不包含0和1的素數,並且想要找到只包含0和1的素數?現在,如果我有{0,1,3, 5,8} ---->編譯後它會發現0和1爲素數。「找到的素數= 0素數找到= 1素數找到= 3素數找到= 5」這是我的程序: 謝謝您的幫助。從數組中刪除素數-java

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]); 
     } 
    } 
} 
+1

什麼是您的實際問題/問題被取代?您的代碼似乎已經正確識別用戶輸入的素數。 –

+0

現在我有0和1作爲素數,但我想排除0和1。我已經試過這一行:if(arr [i]%j == 0 ||(arr [i] == 0 )|| arr [i] == 1),但沒有任何變化 – Invictus05

+0

這顯然不起作用。如果數字是0或1,你是否試圖考慮你的程序是否可以達到'if'?它顯然不能。 – Tom

回答

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} 
0

你的問題不是很清楚,但我假設你的問題是,你的代碼張貼認爲0和1作爲素數,你不想這樣做。如果是這樣的話。的錯誤是支票

是內for循環

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

事實上,當ARR [i]是等於0或1,條件

j<arr[i]-1 

將立即評估爲假,因爲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 

將評估爲true。

一種解決方案是從那裏現在是刪除復

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

,並把它放在相同的,如果是,其條件是

status==true 

改變==與後一個!= 。

簡而言之,

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,即未賦值的元素。你應該保持一個不同的索引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]); 
    }