回答編集履歴

3

テキスト修正

2020/02/09 02:10

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2020/02/09 02:10

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2020/02/09 02:00

投稿

jun68ykt
jun68ykt

スコア9058

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