(I)自分自身以外の約数の和を求める関数を作る
約数の性質としてn
の約数にi
が含まれたらn / i
もn
の約数です。そのためループは2以上√n未満です。
.n
が平方数の場合だけ約数の和sum
にその平方根を加えましょう。
(II)for
文で友愛数を求める
下にあるコードでif num2 == i and num1 < num2:
とありますがそれぞれの意味は
(i)num2 == i
友愛数なら
(ii)num1 < num2
友愛数の一つの組が一つだけ表示されるように(例えば, (220,284) (284,220)などと
表示しされるのを (220,284)だけ表示されるようにする)
です。
python
1import math
2
3def sum_divisor(n):
4 if n <= 1:
5 return 0
6 sum = 1
7 for i in range(2,int(math.sqrt(n))):
8 if n % i == 0:
9 sum += i
10 sum += n / i
11 if int(math.sqrt(n)) ** 2 == n:
12 sum += int(math.sqrt(n))
13 return int(sum)
14
15for i in range(2,15000):
16 num1 = sum_divisor(i)
17 num2 = sum_divisor(num1)
18 if num2 == i and num1 < num2:
19 print(num1,num2)
20
<実行結果>
220 284
1184 1210
2620 2924
5020 5564
6232 6368
10744 10856
12285 14595
<追記>
.import
を使わずに書く方法です。LouiS0616さんのご指摘のように平方根はn ** 0.5
でできます。
python
1def sum_divisor(n):
2 if n <= 1:
3 return 0
4 sum = 1
5 for i in range(2,int(n ** 0.5)):
6 if n % i == 0:
7 sum += i
8 sum += n / i
9
10 if int(n ** 0.5) ** 2 == n:
11 sum += int(n ** 0.5)
12 return int(sum)
13
14for i in range(2,15000):
15 num1 = sum_divisor(i)
16 num2 = sum_divisor(num1)
17 if num2 == i and num1 < num2:
18 print(num1,num2)
<追記2>
処理速度は落ちますが、list
を使った方法も一応載せておきます。
python
1def sum_divisors(n):
2 divisors = []
3 for i in range(1,n):
4 if n % i == 0:
5 divisors.append(i)
6 sum = 0
7 for number in divisors:
8 sum += number
9 return sum
10
11for i in range(2,1500):
12 num1 = sum_divisors(i)
13 num2 = sum_divisors(num1)
14 if i == num2 and num1 < num2:
15 print(num1,num2)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/13 07:04
2018/09/13 07:04
2018/09/13 07:07
2018/09/13 07:35 編集
2018/09/13 07:31
2018/09/13 07:40
2018/09/13 07:58
2018/09/13 08:01
2018/09/13 08:13
2018/09/13 08:22
2018/09/13 13:03
2018/09/13 13:04
2018/09/13 13:23
2018/09/15 10:24