2015-10-12 3 views
5

これは私の最初の投稿ですのでDO私は何か愚かな書きました。 数字の約数のリスト

は私だけでITのクラス、そして今日を始めたループ「ながら」クラス私の教師は私達に、次の宿題与えた:

1つのグラフィカル・ボックスの自然数nと、すべて表示さ読み込むプログラムを書きます区間からの除数[2; n-1]となる。問題は、ループがゼロの多くの配列、およびのスクリーンショットを埋めることである

import java.util.Arrays; 
import javax.swing.JOptionPane; 

public class Divisors { 
    public static void main(String[] args) { 
     String n = JOptionPane.showInputDialog(null, "Enter a natural number"); 
     Integer i = Integer.parseInt(n); 

     int d = i - 1; 
     int x = 2; 
     int[] dvr = new int[i]; // [i] because bigger numbers need more iterations 

     while (x >= 2 && x <= d) { 
      double y = i % x; 

      if (y == 0) { 
       dvr[x] = x; 
       x = x + 1; 
      } else { 
       x = x + 1; 
      } 
     } 

     JOptionPane.showMessageDialog(null, "The divisors of " + i + " are:\n" + Arrays.toString(dvr)); 
    } 
} 

は、これまでのところ私は動作しますが、結果は少し間違っているコードを思い付い家庭教師の結果には、除数のみをリストしたウィンドウが表示されます。

私はArrayListでこれをやろうとしましたが、それは私にとって今は黒い魔法です。私の教師は私のコードで使われているもの以外のものを使用する方法を教えていませんでした。

ご協力いただきありがとうございます。

+2

にのArrayList varibleを取ります。 – azurefrog

+1

問題はdvr [x] = xです。 xの位置に除数の値を設定する必要はありません。配列にインデックスを付けるためには、各除数を追加した後にのみインクリメントする2番目の変数が必要です。 – bhspencer

+0

@bhspencerしかし、私はまだ配列のスロットの所定数を持っています – Shamanix

答えて

4

までの配列を印刷することができますそれらを格納する配列、および配列は固定サイズです。 intの配列があるため、デフォルト値の0がすべて設定されます。

理想的には、配列の0以外の値の最初の束だけを印刷しますが、配列全体に散らばっている除数を格納しています。

dvr[x] = x;は、実際には新しい値を配列の次の開いた場所に保存する必要があるときに、各値をその値のインデックスに格納します。

別のインデックス変数を作成し、代わりにそれを使用して、各値を格納:あなたのメインループが終了したとき

int index = 0; 
    while (x >= 2 && x <= d) { 
    ... 
     if (y == 0) { 
      dvr[index++] = x; 
    ... 

はその後、あなただけの除数を保持している新しい「ディスプレイアレイ」を作成し、することはできませんゼロ。この時点で、indexは、それがする必要があります正確にどのように大規模なあなたに伝えます:

int[] display = Arrays.copyOf(dvr, index); 
    JOptionPane.showMessageDialog(null, "The divisors of " + i + " are:\n" + Arrays.toString(display)); 
+0

ありがとうございました!それは完全な説明です。 – Shamanix

3

Javaでは、intのデフォルト値はゼロです。だからこそ、あなたは多くのゼロを見るのです。

除数の数が常にiより少なくなるため、配列のサイズをiにする必要があります。

アレイ全体を印刷する代わりに、xではなく、別の変数を指定する除数の総数まで印刷するだけです。

ここでは、別のindex変数を使用して、0から始まる除数の数を追跡するための変数を変更しました。最後に、あなたはちょうどあなたが抱えている主な問題は、あなたが印刷したい値の不明な数を持っているつもりだが、あなたが使用していることであるindex

import java.util.Arrays; 
import javax.swing.JOptionPane; 

public class Divisors { 
public static void main(String[] args) { 
    String n = JOptionPane.showInputDialog(null, "Enter a natural number"); 
    Integer i = Integer.parseInt(n); 

    int d = i - 1; 
    int index = 0; 
    int x=2; 
    int[] dvr = new int[i]; // [i] because bigger numbers need more iterations 

    while (x >= 2 && x <= d) { 
     double y = i % x; 

     if (y == 0) { 
      dvr[index] = x; 
      x = x + 1; 
      index= index + 1; 
     } else { 
      x = x + 1; 
     } 
    } 

    JOptionPane.showMessageDialog(null, "The divisors of " + i + " are:\n" + Arrays.copyOfRange(drv, 0, index)); 
} 
} 
+0

問題は、除数条件のチェックに失敗した場合はx変数もインクリメントされます(else部分参照)。だからxは、実際には除数の数を表していないでしょう。 – Ish

+0

ええ問題を修正しました。 – pgiitu

+1

これは言うべきです: 'int'のデフォルト値はゼロです。 –

1

Setデータ構造は、重複を避けるには、データ構造に追加取得重複除数の問題を克服するためにそれを使用することができます。

import java.util.*; 
    import javax.swing.JOptionPane; 

    public class Divisors { 
     public static void main(String[] args) { 
      String n = JOptionPane.showInputDialog(null, "Enter a natural number"); 
      Integer i = Integer.parseInt(n); 

      int d = i - 1; 
      int x = 2; 
      Set<Integer> divisors = new HashSet<>(); 

      while (x >= 2 && x <= d) { 
       double y = i % x; 

       if (y == 0) { 
        divisors.add(x); 
        x = x + 1; 
       } else { 
        x = x + 1; 
       } 
      } 

      List<Integer> l = new ArrayList<>(divisors); 
      JOptionPane.showMessageDialog(null, "The divisors of " + i + " are:\n" + l); 
     } 
    } 
+1

OPはOPクラスのスコープを超えているため、OPはListまたはArrayListソリューションが必要ないと思われます。また、この回答ではコードに関する説明はありません。 –

+0

OPは彼の問題ではありません。ListやArrayList、SetやCollectionクラスに入ることなく進歩できます。説明、はい、私は提供する必要があります。 –

+0

@deepakmarathe私はそれを望んでいないわけではありません、私の教師は私たちのコードをチェックし、彼はすでに彼が言及しなかったツールを使用するためにいくつかの人々を倒す。私はそれが悪いことを知っているが、それは何よりも優れている... – Shamanix

1

DynamicListを作成するには、ArrayListを使用します。
以下のコードを参考にしてください。
プログラム内で変更する必要があります。

  1. import java.util。*;
  2. あなたはそれを作成するときに実際に、配列はすべてゼロに初期化され、あなたのループはゼロでそれを埋めていないのArrayListオブジェクトの
  3. コールtoStringメソッド
import java.util.*; 
import javax.swing.JOptionPane; 

public class NewClass3 { 
    public static void main(String[] args) { 
     String n = JOptionPane.showInputDialog(null, "Enter a natural number"); 
     Integer i = Integer.parseInt(n); 

     int d = i - 1; 
     int x = 2; 
     List<Integer> dvr = new ArrayList<>(); 
     while (x >= 2 && x <= d) { 
      double y = i % x; 

      if (y == 0) { 
       dvr.add(x); 
       x=x+1; 
      } else { 
       x = x + 1; 
      } 
     } 

     JOptionPane.showMessageDialog(null, "The divisors of " + i + " are:\n" + dvr.toString()); 
    } 
} 
関連する問題