質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1199閲覧

python 友愛数

taiyodesu

総合スコア4

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/11/03 05:49

前提・実現したいこと

pythonで、1~10000の中の全ての友愛数を算出するコードを書きたいです。

Wikipedia 220 の自分自身を除いた約数は、1, 2, 4, 5, 10, 11, 20, 22, 44, 55, 110 で、和は 284 となる。一方、284 の自分自身を除いた約数は、1, 2, 4, 71, 142 で、和は 220 である。

上記は友愛数の定義になりますが、この場合220と284を出力したいです。

試したこと

一応試して見ましたが、エラーが出てしまい、やり方が合っているのかもわからない状態です。もし、正しいのでしたら、修正を加えてもらえたら幸いです。根本から間違っていましたら、書き方を教えて頂けないでしょうか?

python

1divisorlist=[], z=[] 2for x in range(2,10000): 3 for i in range(2,x): 4 if (x%i==0): 5 divisorlist.append(i) 6 j=sum(divisorlist) 7 for h in range (2,j): 8 if (j%h==0): 9 z.append(h) 10 if (x==sum(z)): 11 print(x,j)

エラー

python

1Traceback (most recent call last): 2 File "file名", line 1, in <module> 3 divisorlist=[], z=[] 4ValueError: not enough values to unpack (expected 2, got 0)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

以下の4つの観点で修正が必要です。

  • 冒頭は単なる構文ミスです。
  • しかし冒頭に約数リストを初期化しただけだと、以降、約数リストがどんどん膨らんでしまいます。そのため初期化の位置をずらす必要があります。
  • 残念ながら約数1を数え損なっています。
  • 友愛数は「異なる2つの自然数」という条件がついていますので、x==jになる完全数は含みません。またxとjが交換してできる組みは同じ友愛数の組みとみなしますので、表示から除く必要があります。

結果、以下のようにすると動作します。なお、私のmacで実行時間は7秒です。

Python

1for x in range(2,10000): 2 divisorlist =[] 3 for i in range(1,x): 4 if (x%i==0): 5 divisorlist.append(i) 6 j=sum(divisorlist) 7 if x >= j: 8 continue 9 z =[] 10 for h in range (1,j): 11 if (j%h==0): 12 z.append(h) 13 if (x==sum(z)): 14 print(x,j)

投稿2020/11/03 06:18

編集2020/11/03 06:29
toast-uz

総合スコア3266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taiyodesu

2020/11/05 05:09

ありがとうございます!初期化の位置をずらす所は盲点でした...助かりました!
guest

0

まず divisorlist=[], z=[]は提示エラーが発生しますので
divisorlist=[];z=[]あるいはdivisorlist,z=[],[]で解消します。
ただ提示コードでは時間がかかって回答にたどり着けないと思われます。

そこでWhat is the most efficient way to find amicable numbers in python?の回答のように

  • 効率的に約数の和を求める
  • 2重ループではなく1重ループにする(友愛数の候補を求め、それが合致するかを求める)

ようにするとよいです。

投稿2020/11/03 06:11

can110

総合スコア38278

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toast-uz

2020/11/03 06:31

冒頭だけ直して、時間がかかるなー、とワタシも思いましたが、よくよく確認すると、約数リストが初期化されずにどんどん膨らんでいただけでした。
can110

2020/11/03 06:43

同じく冒頭だけ直して時間かかりそうなので後のコードは確認してませんでした。 ちゃんと修正すると回答得られますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問