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

回答編集履歴

5

説明の追加

2018/09/13 12:31

投稿

退会済みユーザー
answer CHANGED
@@ -3,10 +3,9 @@
3
3
  .```n```が平方数の場合だけ約数の和```sum```にその平方根を加えましょう。
4
4
 
5
5
  (II)```for```文で友愛数を求める
6
- 下にあるコードで```if num2 == i and num1 != num2 and num1 < num2:```とありますがそれぞれの意味は
6
+ 下にあるコードで```if num2 == i and num1 < num2:```とありますがそれぞれの意味は
7
7
  (i)```num2 == i``` 友愛数なら
8
- (ii)```num1 != num2``` 友愛数の中でもより特別な完全数は除き
9
- (iii)```num1 < num2``` 友愛数の一つの組が一つだけ表示されるように(例えば, (220,284) (284,220)などと
8
+ (ii)```num1 < num2``` 友愛数の一つの組が一つだけ表示されるように(例えば, (220,284) (284,220)などと
10
9
  表示しされるのを (220,284)だけ表示されるようにする) 
11
10
 
12
11
  です。
@@ -29,7 +28,7 @@
29
28
  for i in range(2,15000):
30
29
  num1 = sum_divisor(i)
31
30
  num2 = sum_divisor(num1)
32
- if num2 == i and num1 != num2 and num1 < num2:
31
+ if num2 == i and num1 < num2:
33
32
  print(num1,num2)
34
33
 
35
34
  ```
@@ -62,6 +61,26 @@
62
61
  for i in range(2,15000):
63
62
  num1 = sum_divisor(i)
64
63
  num2 = sum_divisor(num1)
65
- if num2 == i and num1 != num2 and num1 < num2:
64
+ if num2 == i and num1 < num2:
66
65
  print(num1,num2)
66
+ ```
67
+ <追記2>
68
+ 処理速度は落ちますが、```list```を使った方法も一応載せておきます。
69
+
70
+ ```python
71
+ def sum_divisors(n):
72
+ divisors = []
73
+ for i in range(1,n):
74
+ if n % i == 0:
75
+ divisors.append(i)
76
+ sum = 0
77
+ for number in divisors:
78
+ sum += number
79
+ return sum
80
+
81
+ for i in range(2,1500):
82
+ num1 = sum_divisors(i)
83
+ num2 = sum_divisors(num1)
84
+ if i == num2 and num1 < num2:
85
+ print(num1,num2)
67
86
  ```

4

説明の訂正

2018/09/13 12:31

投稿

退会済みユーザー
answer CHANGED
@@ -43,7 +43,7 @@
43
43
  12285 14595
44
44
 
45
45
  <追記>
46
- .```import```を使わずに書く方法です。
46
+ .```import```を使わずに書く方法です。LouiS0616さんのご指摘のように平方根は```n ** 0.5```でできます。
47
47
 
48
48
  ```python
49
49
  def sum_divisor(n):
@@ -55,7 +55,7 @@
55
55
  sum += i
56
56
  sum += n / i
57
57
 
58
- if int(n ** 0.5) * int(n ** 0.5) == n:
58
+ if int(n ** 0.5) ** 2 == n:
59
59
  sum += int(n ** 0.5)
60
60
  return int(sum)
61
61
 

3

ソースの訂正

2018/09/13 07:31

投稿

退会済みユーザー
answer CHANGED
@@ -43,21 +43,23 @@
43
43
  12285 14595
44
44
 
45
45
  <追記>
46
- .```import```を使わずに書く方法です。ただ```import```を使わなかったら,平方根が出せないのでその分
46
+ .```import```を使わずに書く方法です。
47
- 処理速度が落ちます。そのため、下に書いたコードでは友愛数を```for```文で表示するところでループさせる回数を
48
- 減らしています。
49
47
 
50
48
  ```python
51
49
  def sum_divisor(n):
52
50
  if n <= 1:
53
51
  return 0
54
52
  sum = 1
55
- for i in range(2,n):
53
+ for i in range(2,int(n ** 0.5)):
56
54
  if n % i == 0:
57
55
  sum += i
56
+ sum += n / i
57
+
58
+ if int(n ** 0.5) * int(n ** 0.5) == n:
59
+ sum += int(n ** 0.5)
58
- return sum
60
+ return int(sum)
59
61
 
60
- for i in range(2,5000):
62
+ for i in range(2,15000):
61
63
  num1 = sum_divisor(i)
62
64
  num2 = sum_divisor(num1)
63
65
  if num2 == i and num1 != num2 and num1 < num2:

2

誤字の訂正

2018/09/13 07:26

投稿

退会済みユーザー
answer CHANGED
@@ -6,7 +6,9 @@
6
6
  下にあるコードで```if num2 == i and num1 != num2 and num1 < num2:```とありますがそれぞれの意味は
7
7
  (i)```num2 == i``` 友愛数なら
8
8
  (ii)```num1 != num2``` 友愛数の中でもより特別な完全数は除き
9
- (iii)```num1 < num2``` 友愛数の一つの組が一つだけ表示されるように(例えば, (220,284) (284,220)などとひょうじしされるのを (220,284)だけ表示されるようにする)
9
+ (iii)```num1 < num2``` 友愛数の一つの組が一つだけ表示されるように(例えば, (220,284) (284,220)などと
10
+ 表示しされるのを (220,284)だけ表示されるようにする) 
11
+
10
12
  です。
11
13
 
12
14
  ```python
@@ -41,8 +43,9 @@
41
43
  12285 14595
42
44
 
43
45
  <追記>
44
- importを使わずに書く方法です。ただimportを使わなかったら,平方根が出せないのでその分
46
+ .```import```を使わずに書く方法です。ただ```import```を使わなかったら,平方根が出せないのでその分
47
+ 処理速度が落ちます。そのため、下に書いたコードでは友愛数を```for```文で表示するところでループさせる回数を
45
- 処理速度が落ちます。
48
+ 減らしています。
46
49
 
47
50
  ```python
48
51
  def sum_divisor(n):

1

ソースの追加

2018/09/13 07:22

投稿

退会済みユーザー
answer CHANGED
@@ -38,4 +38,25 @@
38
38
  5020 5564
39
39
  6232 6368
40
40
  10744 10856
41
- 12285 14595
41
+ 12285 14595
42
+
43
+ <追記>
44
+ importを使わずに書く方法です。ただimportを使わなかったら,平方根が出せないのでその分
45
+ 処理速度が落ちます。
46
+
47
+ ```python
48
+ def sum_divisor(n):
49
+ if n <= 1:
50
+ return 0
51
+ sum = 1
52
+ for i in range(2,n):
53
+ if n % i == 0:
54
+ sum += i
55
+ return sum
56
+
57
+ for i in range(2,5000):
58
+ num1 = sum_divisor(i)
59
+ num2 = sum_divisor(num1)
60
+ if num2 == i and num1 != num2 and num1 < num2:
61
+ print(num1,num2)
62
+ ```