Javaにて、ある数値を入力したら、その数値の約数を返すプログラムを書いています。
Java
1int i; 2for (i = 1; i <= n; i++) { 3 if (n % i == 0) { 4 System.out.println(i); 5 } 6}
このコードの前に、入力された数値を変数nに代入しています。
この時点で入力された数値の約数はiで出力されるのですが、その約数を配列に格納したいです。
Java
1int[] arr = new int[];
まで書いたのですが、出力される約数の数は入力された数値によって変わるのでその場合どのように書けば良いか悩んでいます。
ご存知の方、ご教示いただけたら幸いです。
よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答4件
0
ベストアンサー
Javaの配列は宣言時に個数が決まってしまうので、このような場合には向きません。代わりにArrayList
(Oracle)などを使いましょう。
java
1ArrayList<Integer> arr = new ArrayList<Integer>();
投稿2018/04/09 02:37
総合スコア146544
0
あえて配列だけで挑んでみた
java
1int n = 237; //ここは適当 2int copy = n; 3int x = 1; 4int i = 2; 5int count = 1; 6//素因数分解から約数の個数を求める 7while (copy > 1 || x > 1) { 8 if (copy % i != 0) { 9 count *= x; 10 x = 1; 11 i++; 12 continue; 13 } 14 copy /= i; 15 x++; 16} 17int[] arr = new int[count]; 18// 以下、約数を配列に格納していけばいい
投稿2018/04/09 03:23
総合スコア20675
0
格納する個数が動的な場合の配列の作り方ですよね。
下記が参考になるのではないでしょうか。
投稿2018/04/09 02:35
総合スコア80888
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
次のような方針を思いつきます。
0. ArrayList を使う
- 結果の個数をもとめてから、そのサイズの配列を作ってそこに格納していく
- ある程度のサイズの配列をつくってそこに格納していく。配列があふれそうになったら、もっと多きサイズの配列を用意して処理を続ける
0 は maisumaku の回答、
1 は swordone さんの回答があります。
1 の別の方法、2 の方法の例を書いてみました。
java
1import java.util.Arrays; 2 3public class Div10 { 4 5 public static void main(String[] args) { 6 int n = 120; 7 int count = div(n, null); // 個数だけを求める 8 int[] divs = new int[count]; 9 div(n, divs); // 約数を divs に記録する 10 System.out.println(Arrays.toString(divs)); 11 } 12 13 static int div(int n, int[] ary) { 14 int count = 0; 15 // i が約数なら n / i も約数。 1.. sqrt(n) まで割り算を試す。 16 for (int i = 1; i <= Math.sqrt(n); i++) { 17 if (n % i == 0) { 18 if (ary != null) { 19 ary[count] = i; 20 } 21 count++; 22 if (i < n / i) { 23 if (ary != null) { 24 ary[count] = n / i; 25 } 26 count++; 27 } 28 } 29 } 30 if (ary != null) { 31 Arrays.sort(ary); 32 } 33 return count; 34 } 35}
java
1import java.util.Arrays; 2 3public class Div20 { 4 5 public static void main(String[] args) { 6 int n = 120; 7 int[] divs = div(n); 8 System.out.println(Arrays.toString(divs)); 9 } 10 11 static int[] div(int n) { 12 int count = 0; 13 int divs_size = 3; 14 int[] divs = new int[3]; 15 for (int i = 1; i <= n; i++) { 16 if (n % i == 0) { 17 if (divs_size == count) { 18 divs_size += 2; 19 int[] new_divs = new int[divs_size * 2]; 20 System.arraycopy(divs, 0, new_divs, 0, divs.length); 21 divs = new_divs; 22 } 23 divs[count] = i; 24 count++; 25 } 26 } 27 int[] ans = new int[count]; 28 System.arraycopy(divs, 0, ans, 0, ans.length); 29 return ans; 30 } 31}
参考情報
- 【中学数学】正の約数の個数の求め方がわかる3ステップ
http://media.qikeru.me/positive-divisor-number/
- 素因数分解のアルゴリズム
投稿2018/04/09 13:52
総合スコア22328
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/09 03:36