回答編集履歴

10

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

2017/08/04 14:28

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -130,7 +130,7 @@
130
130
 
131
131
  ---
132
132
 
133
- anahina1979が、以下のとおり**驚くべき真実**を教えてくださいました。
133
+ anahina1979さんが、以下のとおり**驚くべき真実**を教えてくださいました。
134
134
 
135
135
  > ちなみに、素数は2以外の偶数は存在しない
136
136
 

9

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

2017/08/04 14:28

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -68,7 +68,7 @@
68
68
 
69
69
 
70
70
 
71
- 再帰処理を用いれば実現可能です。
71
+ 再帰処理を用いれば実現可能です。**(ただし、非推奨)**
72
72
 
73
73
  ```Java
74
74
 
@@ -105,6 +105,10 @@
105
105
 
106
106
 
107
107
  なんか、Javaっぽくないプログラムになってしまいました...
108
+
109
+ **raccyさんの指摘のとおり、Javaでの安易な再帰処理の使用は推奨されません。**
110
+
111
+ 特に拘りや制約条件のない限り、ループで処理するのがよいでしょう。
108
112
 
109
113
 
110
114
 

8

追記

2017/08/04 13:47

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -167,3 +167,7 @@
167
167
  }
168
168
 
169
169
  ```
170
+
171
+
172
+
173
+ 処理速度が上がって、オーダーで言うとO(n)からO(n)になりましたね!

7

追記

2017/08/04 12:45

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -119,3 +119,51 @@
119
119
  これをしているかどうかで、回答の量と質が変わってきます。
120
120
 
121
121
  (マークダウン記法を用いていない質問者には回答しない、という方針の人もいます。)
122
+
123
+
124
+
125
+ 追記
126
+
127
+ ---
128
+
129
+ anahina1979が、以下のとおり**驚くべき真実**を教えてくださいました。
130
+
131
+ > ちなみに、素数は2以外の偶数は存在しない
132
+
133
+
134
+
135
+ それを反映するとこうなります。
136
+
137
+ ```Java
138
+
139
+ while(y % 2 == 0) {
140
+
141
+ System.out.println(2);
142
+
143
+ y /= 2;
144
+
145
+ }
146
+
147
+
148
+
149
+ i = 3;
150
+
151
+ while(y != 1) {
152
+
153
+ if(y % i == 0) {
154
+
155
+ System.out.println(i);
156
+
157
+ y /= i;
158
+
159
+ }
160
+
161
+ else {
162
+
163
+ i+=2;
164
+
165
+ }
166
+
167
+ }
168
+
169
+ ```

6

訂正

2017/08/04 12:31

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
 
8
8
 
9
- `if((y % i) == 0)`という分岐で、何をコントロールしているのかじっくり考えてください。
9
+ `((y % i) == 0)`という条件式で、何をコントロールしているのかじっくり考えてください。
10
10
 
11
11
 
12
12
 

5

コード訂正

2017/08/04 09:41

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -94,7 +94,7 @@
94
94
 
95
95
  }
96
96
 
97
- private printPrimeFactor(int arg) {
97
+ private void printPrimeFactor(int arg) {
98
98
 
99
99
  recursionPrime(arg, 2);
100
100
 

4

成形と追記

2017/08/04 09:40

投稿

LouiS0616
LouiS0616

スコア35660

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

3

追記

2017/08/04 09:40

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -77,3 +77,17 @@
77
77
 
78
78
 
79
79
  なんか、Javaっぽくないプログラムになってしまいました...
80
+
81
+
82
+
83
+ 重要
84
+
85
+ ---
86
+
87
+ コードはバッククオート三つで括ってください。
88
+
89
+ よくわからない場合は、マークダウン記法について調べてみてください。
90
+
91
+ これをしているかどうかで、回答の量と質が変わってきます。
92
+
93
+ (マークダウン記法を用いていない質問者には回答しない、という方針の人もいます。)

2

追記

2017/08/04 09:22

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -31,3 +31,49 @@
31
31
  元のプログラムで内部にループを用いているのは、二回以上用いられる約数のためです。
32
32
 
33
33
  内部のループを外すと、24 = 1*2*2*2*3が計算できません。
34
+
35
+
36
+
37
+ ---
38
+
39
+ > そもそも、繰り返し処理を記述しなければいけないのでしょうか?
40
+
41
+
42
+
43
+ 再帰処理を用いれば実現可能です。
44
+
45
+ ```Java
46
+
47
+ private void recursionPrime(int arg, int div) {
48
+
49
+ if(arg == 1) return;
50
+
51
+
52
+
53
+ if(arg % div == 0) {
54
+
55
+ System.out.println(div);
56
+
57
+ recursionPrime(arg/div, div);
58
+
59
+ }
60
+
61
+ else {
62
+
63
+ recurtionPrime(arg, div+1);
64
+
65
+ }
66
+
67
+ }
68
+
69
+ private printPrimeFactor(int arg) {
70
+
71
+ recursionPrime(arg, 2);
72
+
73
+ }
74
+
75
+ ```
76
+
77
+
78
+
79
+ なんか、Javaっぽくないプログラムになってしまいました...

1

コード訂正

2017/08/04 09:18

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  int i = 2;
6
6
 
7
- while(y > i) {
7
+ while(y != 1) {
8
8
 
9
9
  if(y % i == 0) {
10
10