回答編集履歴
3
テキスト修正
test
CHANGED
@@ -202,4 +202,4 @@
|
|
202
202
|
|
203
203
|
|
204
204
|
|
205
|
-
上記だと、たとえば 105 が入力されると、 `x` が 35 になったときに break でループから抜けます。この `y` による break がないと、`x` が 52 になるまでループします。
|
205
|
+
上記だと、たとえば 105 が入力されると、 `x` が 35 になったときに break でループから抜けます。この `y` による break がない、ひとつ前のコードだと、`x` が 52 になるまでループします。
|
2
テキスト修正
test
CHANGED
@@ -151,3 +151,55 @@
|
|
151
151
|
|
152
152
|
|
153
153
|
以上、参考になれば幸いです。
|
154
|
+
|
155
|
+
|
156
|
+
|
157
|
+
### 補足
|
158
|
+
|
159
|
+
|
160
|
+
|
161
|
+
蛇足ですが、さらにループの回数を少なくする改善案を挙げておきます。
|
162
|
+
|
163
|
+
|
164
|
+
|
165
|
+
たとえば、105 が入力されたとき、 1 よりも大きい最小の約数は 3 です。105 を 3 で割った商は 35 ですが、この 35 が、 105 それ自体よりも小さい約数としては最大になります。これを一般化してコードにするとすれば、
|
166
|
+
|
167
|
+
|
168
|
+
|
169
|
+
- 1ではない、最小の `x` で`number`を割り切れたとき、その商を `y` とすれば、`number`自体よりも小さい約数のうち最大のものが `y` になる。ゆえに、`x` が `y` に等しくなったときループを抜けることができる。
|
170
|
+
|
171
|
+
|
172
|
+
|
173
|
+
ということになります。上記を追加したコードが以下です。
|
174
|
+
|
175
|
+
|
176
|
+
|
177
|
+
```python3
|
178
|
+
|
179
|
+
def divisor():
|
180
|
+
|
181
|
+
number = int(input("Number:"))
|
182
|
+
|
183
|
+
y = 0
|
184
|
+
|
185
|
+
for x in range(1, number // 2 + 1):
|
186
|
+
|
187
|
+
if number % x == 0:
|
188
|
+
|
189
|
+
print(x)
|
190
|
+
|
191
|
+
if y == 0 and x > 1:
|
192
|
+
|
193
|
+
y = number // x
|
194
|
+
|
195
|
+
if x == y:
|
196
|
+
|
197
|
+
break
|
198
|
+
|
199
|
+
print(number)
|
200
|
+
|
201
|
+
```
|
202
|
+
|
203
|
+
|
204
|
+
|
205
|
+
上記だと、たとえば 105 が入力されると、 `x` が 35 になったときに break でループから抜けます。この `y` による break がないと、`x` が 52 になるまでループします。
|
1
テキスト修正
test
CHANGED
@@ -126,7 +126,7 @@
|
|
126
126
|
|
127
127
|
```
|
128
128
|
|
129
|
-
これでとりあえず、(少なくとも正の整数を入力されたときは)意図通りの出力が得られると思いますが、最後にもう一点、改善の余地があります。たとえば`12`が入力されたとき、上記のコードだと、12回ループして`x`は1以上12以下の値をとります
|
129
|
+
これでとりあえず、(少なくとも正の整数を入力されたときは)意図通りの出力が得られると思いますが、最後にもう一点、改善の余地があります。たとえば`12`が入力されたとき、上記のコードだと、12回ループして`x`は1以上12以下の値をとりますが、入力されたその数自体が約数になることは自明なのと、その数自体以外の約数は、その数の半分以下であるので、以下のようにしてループ回数を半分に出来ます。
|
130
130
|
|
131
131
|
|
132
132
|
|