2017-10-13 8 views
0

このプログラムは、1より大きい最小数と最小値よりも大きい最大数をユーザーに尋ねます。それが素数と完全数の数が表示され終わりプライム/パーフェクト/コンポジットナンバーチェッカーをより効率的/クリーナーにする

2 is divisible by 1 
2 is prime. 
2 is not perfect 

3 is divisible by 1 
3 is prime. 
3 is not perfect 

4 is divisible by 1 2 
4 is composite. 
4 is not perfect. 

5 is divisible by 1 
5 is prime. 
5 is not perfect 

6 is divisible by 1 2 3 
6 is composite. 
6 is perfect. 

:それはそのプライムまたはコンポジット、およびこの形式での完全数の場合であれば、何によってその割り切れる数で番号を出力します。プログラムは動作しますが、それは、より効率的(あるいは間違って何イムがある場合)を作成/コードをクリーンアップする任意の方法がある場合、私は疑問に思って

コード:

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    Scanner input = new Scanner(System.in); 

    int min; 
    int max; 

    //declaring min and max values 

    System.out.println("Enter minimum value to check (an integer greater than 1:)"); 
    min=input.nextInt(); 

    while(!(min>1)) { 
     System.out.println("The entry is valid. Please be sure to enter an integer greater than 1"); 
     System.out.println(); 
     System.out.println("Enter minimum value to check (an integer greater than 1:)"); 
     min=input.nextInt(); 
    } 

    System.out.println("Enter maximum value to check (an integer greater than your min value:)"); 
    max=input.nextInt(); 

    while(!(max>min)) { 
     System.out.println("The entry is valid. Please be sure to enter an integer greater than the min value"); 
     System.out.println(); 
     System.out.println("Enter maximum value to check (an integer greater than min:)"); 
     max=input.nextInt(); 
    } 

    //declaring count and tracking variables 

    int count; 
    int numPrime=0; 
    int numPerfect=0; 
    int temp=1; 
    String result=" "; 
    boolean isPrime=true; 
    boolean isPerfect=false; 
    int i; 
    //main loop 

    for(count=min;count<=max;count++) { 

     for(i=2;i<=count;i++) { 
      if(count%i==0&&i!=count) { 
       isPrime=false; 
       result=result+i+" "; 
       temp+=i; 
      } 
      else 
       isPrime=true; 
     } 
     //Perfect counter 
     if(temp==count) { 
      isPerfect=true; 
      numPerfect=numPerfect+1; 
     } 
     else 
      isPerfect=false; 
     //Composite print 
     if(!(result.equals(" "))) { 
      System.out.println(count+" is divisible by 1"+result); 
      System.out.println(count+" is composite."); 
      if(isPerfect==true) 
       System.out.println(count+" is perfect."); 
      else 
       System.out.println(count+ " is not perfect."); 
      System.out.println(); 
     } 
     //Prime print 
     else { 
      numPrime=numPrime+1; 
      System.out.println(count+" is divisible by 1"); 
      System.out.println(count+" is prime."); 
      System.out.println(count+" is not perfect"); 
      System.out.println(); 
     }   
     //reset values 
     result=" "; 
     temp=1; 
    } 
    System.out.println("Primes found: "+numPrime); 
    System.out.println("Perfect numbers found: "+numPerfect); 


} 

}

+4

[コードレビュー](http://codereview.stackexchange.com/)で投稿することをおすすめします。 –

+0

ありがとうございます! – rmcknst2

+0

これは宿題なので、学習の機会を台無しにしたくないですが、forループの繰り返し回数を減らすことができると思いますか? 特に、(i = 2; i <= count; i ++)に対して。あなたは本当に2から数えるために反復する必要がありますか? countが144の場合、iの値はほとんど常に144の除数にはなりません.133の場合、なぜ繰り返し処理する必要がありますか? – JustinDanielson

答えて

0

私はPythonの完璧な数値コードをできるだけ効率的にするという趣味を持っているので、いくつかの効率的なことが分かっていますが、残念ながら私はJavaをコードしないので、これらは効率の向上につながります。

最初にコメントで示唆されているように、すべての除数を得るには数値の平方根を調べるだけでよいのですが、除数のリストに数値/除数を追加する必要があります

e.g. Find the divisors of 20 
The square root of 20 is 4.47 so we choose 4. 
20 mod 1 == 0 so we add 1 and 20/1 a.k.a. 20 to our list of divisors 
20 mod 2 == 0 so we add 2 and 20/2 a.k.a 10 to our list of divisors 
20 mod 3 == 2 so we ignore this one. 
20 mod 4 == 0 so we add 4 and 20/4 a.k.a. 5 to our list of divisors 
Therefore the divisors are 1, 2, 4, 5, 10 and 20. 

すべての除数を取得するために、もう一つの良い効率の改善はすぐにそれを確認することができますように、すべての完全数が6または28で終わるだろうということです。

私が知っている最後の効率改善は、素数計算ビットの大きな変更です。

If a number is smaller than or equal to 1 it is not prime. 
Else if a number is smaller than or equal to 3 it is prime. 
Else if a number mod 2 or a number mod 3 == 0 it is not prime. 
Set i to 5 
While i squared is smaller than or equal to a number: 
    If a number mod i or a number mod (i + 2) == 0: 
     It is not prime 
    6 is added to i 
If nothing has said otherwise then the number is prime.