ループの中で何をしているのか
for、whileの中のコードの理解が出来ていないです。
((y % i) == 0)
という条件式で、何をコントロールしているのかじっくり考えてください。
ループの中にループがある理由
なぜforの中でさらにwhileで繰り返す必要があるのかわかりません。
『ループが入れ子になっている』『ネストしている』という表現をします。
元のプログラムでループが入れ子になっているのは、二回以上用いられる約数のためです。
内部のループを外すと、24 = 12223が計算できません。
そもそも
二重ループにしているのは無駄だと思います。以下で充分。
Java
1int i = 2;
2while(y != 1) {
3 if(y % i == 0) {
4 System.out.println(i);
5 y /= i;
6 }
7 else {
8 i++;
9 }
10}
繰り返しは必要か
そもそも、繰り返し処理を記述しなければいけないのでしょうか?
再帰処理を用いれば実現可能です。(ただし、非推奨)
Java
1private void recursionPrime(int arg, int div) {
2 if(arg == 1) return;
3
4 if(arg % div == 0) {
5 System.out.println(div);
6 recursionPrime(arg/div, div);
7 }
8 else {
9 recurtionPrime(arg, div+1);
10 }
11}
12private void printPrimeFactor(int arg) {
13 recursionPrime(arg, 2);
14}
なんか、Javaっぽくないプログラムになってしまいました...
raccyさんの指摘のとおり、Javaでの安易な再帰処理の使用は推奨されません。
特に拘りや制約条件のない限り、ループで処理するのがよいでしょう。
重要
コードはバッククオート三つで括ってください。
よくわからない場合は、マークダウン記法について調べてみてください。
これをしているかどうかで、回答の量と質が変わってきます。
(マークダウン記法を用いていない質問者には回答しない、という方針の人もいます。)
追記
anahina1979さんが、以下のとおり驚くべき真実を教えてくださいました。
ちなみに、素数は2以外の偶数は存在しない
それを反映するとこうなります。
Java
1while(y % 2 == 0) {
2 System.out.println(2);
3 y /= 2;
4}
5
6i = 3;
7while(y != 1) {
8 if(y % i == 0) {
9 System.out.println(i);
10 y /= i;
11 }
12 else {
13 i+=2;
14 }
15}
処理速度が上がって、オーダーで言うとO(n)からO(n)になりましたね!
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/04 09:13
2017/08/04 09:16
退会済みユーザー
2017/08/04 12:19
2017/08/04 12:24
2017/08/04 13:29
2017/08/04 13:42
2017/08/04 13:43