teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

10

継承の抜けに気付く。不覚\.\.\.

2017/08/04 14:28

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -64,7 +64,7 @@
64
64
 
65
65
  追記
66
66
  ---
67
- anahina1979が、以下のとおり**驚くべき真実**を教えてくださいました。
67
+ anahina1979さんが、以下のとおり**驚くべき真実**を教えてくださいました。
68
68
  > ちなみに、素数は2以外の偶数は存在しない
69
69
 
70
70
  それを反映するとこうなります。

9

raccyさんの指摘を受けて追記

2017/08/04 14:28

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -33,7 +33,7 @@
33
33
  ---
34
34
  > そもそも、繰り返し処理を記述しなければいけないのでしょうか?
35
35
 
36
- 再帰処理を用いれば実現可能です。
36
+ 再帰処理を用いれば実現可能です。**(ただし、非推奨)**
37
37
  ```Java
38
38
  private void recursionPrime(int arg, int div) {
39
39
  if(arg == 1) return;
@@ -52,6 +52,8 @@
52
52
  ```
53
53
 
54
54
  なんか、Javaっぽくないプログラムになってしまいました...
55
+ **raccyさんの指摘のとおり、Javaでの安易な再帰処理の使用は推奨されません。**
56
+ 特に拘りや制約条件のない限り、ループで処理するのがよいでしょう。
55
57
 
56
58
  重要
57
59
  ---

8

追記

2017/08/04 13:47

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -82,4 +82,6 @@
82
82
  i+=2;
83
83
  }
84
84
  }
85
- ```
85
+ ```
86
+
87
+ 処理速度が上がって、オーダーで言うとO(n)からO(n)になりましたね!

7

追記

2017/08/04 12:45

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -58,4 +58,28 @@
58
58
  コードはバッククオート三つで括ってください。
59
59
  よくわからない場合は、マークダウン記法について調べてみてください。
60
60
  これをしているかどうかで、回答の量と質が変わってきます。
61
- (マークダウン記法を用いていない質問者には回答しない、という方針の人もいます。)
61
+ (マークダウン記法を用いていない質問者には回答しない、という方針の人もいます。)
62
+
63
+ 追記
64
+ ---
65
+ anahina1979が、以下のとおり**驚くべき真実**を教えてくださいました。
66
+ > ちなみに、素数は2以外の偶数は存在しない
67
+
68
+ それを反映するとこうなります。
69
+ ```Java
70
+ while(y % 2 == 0) {
71
+ System.out.println(2);
72
+ y /= 2;
73
+ }
74
+
75
+ i = 3;
76
+ while(y != 1) {
77
+ if(y % i == 0) {
78
+ System.out.println(i);
79
+ y /= i;
80
+ }
81
+ else {
82
+ i+=2;
83
+ }
84
+ }
85
+ ```

6

訂正

2017/08/04 12:31

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -2,7 +2,7 @@
2
2
  ---
3
3
  > for、whileの中のコードの理解が出来ていないです。
4
4
 
5
- `if((y % i) == 0)`という分岐で、何をコントロールしているのかじっくり考えてください。
5
+ `((y % i) == 0)`という条件式で、何をコントロールしているのかじっくり考えてください。
6
6
 
7
7
  ループの中にループがある理由
8
8
  ---

5

コード訂正

2017/08/04 09:41

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -46,7 +46,7 @@
46
46
  recurtionPrime(arg, div+1);
47
47
  }
48
48
  }
49
- private printPrimeFactor(int arg) {
49
+ private void printPrimeFactor(int arg) {
50
50
  recursionPrime(arg, 2);
51
51
  }
52
52
  ```

4

成形と追記

2017/08/04 09:40

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -1,3 +1,20 @@
1
+ ループの中で何をしているのか
2
+ ---
3
+ > for、whileの中のコードの理解が出来ていないです。
4
+
5
+ `if((y % i) == 0)`という分岐で、何をコントロールしているのかじっくり考えてください。
6
+
7
+ ループの中にループがある理由
8
+ ---
9
+ > なぜforの中でさらにwhileで繰り返す必要があるのかわかりません。
10
+
11
+ 『ループが入れ子になっている』『ネストしている』という表現をします。
12
+
13
+ 元のプログラムでループが入れ子になっているのは、二回以上用いられる約数のためです。
14
+ 内部のループを外すと、24 = 1*2*2*2*3が計算できません。
15
+
16
+ そもそも
17
+ ---
1
18
  二重ループにしているのは無駄だと思います。以下で充分。
2
19
  ```Java
3
20
  int i = 2;
@@ -12,11 +29,8 @@
12
29
  }
13
30
  ```
14
31
 
32
+ 繰り返しは必要か
15
33
  ---
16
- 元のプログラムで内部にループを用いているのは、二回以上用いられる約数のためです。
17
- 内部のループを外すと、24 = 1*2*2*2*3が計算できません。
18
-
19
- ---
20
34
  > そもそも、繰り返し処理を記述しなければいけないのでしょうか?
21
35
 
22
36
  再帰処理を用いれば実現可能です。

3

追記

2017/08/04 09:40

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -37,4 +37,11 @@
37
37
  }
38
38
  ```
39
39
 
40
- なんか、Javaっぽくないプログラムになってしまいました...
40
+ なんか、Javaっぽくないプログラムになってしまいました...
41
+
42
+ 重要
43
+ ---
44
+ コードはバッククオート三つで括ってください。
45
+ よくわからない場合は、マークダウン記法について調べてみてください。
46
+ これをしているかどうかで、回答の量と質が変わってきます。
47
+ (マークダウン記法を用いていない質問者には回答しない、という方針の人もいます。)

2

追記

2017/08/04 09:22

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -14,4 +14,27 @@
14
14
 
15
15
  ---
16
16
  元のプログラムで内部にループを用いているのは、二回以上用いられる約数のためです。
17
- 内部のループを外すと、24 = 1*2*2*2*3が計算できません。
17
+ 内部のループを外すと、24 = 1*2*2*2*3が計算できません。
18
+
19
+ ---
20
+ > そもそも、繰り返し処理を記述しなければいけないのでしょうか?
21
+
22
+ 再帰処理を用いれば実現可能です。
23
+ ```Java
24
+ private void recursionPrime(int arg, int div) {
25
+ if(arg == 1) return;
26
+
27
+ if(arg % div == 0) {
28
+ System.out.println(div);
29
+ recursionPrime(arg/div, div);
30
+ }
31
+ else {
32
+ recurtionPrime(arg, div+1);
33
+ }
34
+ }
35
+ private printPrimeFactor(int arg) {
36
+ recursionPrime(arg, 2);
37
+ }
38
+ ```
39
+
40
+ なんか、Javaっぽくないプログラムになってしまいました...

1

コード訂正

2017/08/04 09:18

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -1,7 +1,7 @@
1
1
  二重ループにしているのは無駄だと思います。以下で充分。
2
2
  ```Java
3
3
  int i = 2;
4
- while(y > i) {
4
+ while(y != 1) {
5
5
  if(y % i == 0) {
6
6
  System.out.println(i);
7
7
  y /= i;