編集:ダン、私はインタビューに失敗しました!:-(
「因数分解+除数の列挙+それらの合計」アプローチを改善するためのトリックやヒューリスティックを見つけるための熱心な試みで、9を法として1であることが単に必要であり、確かにatの十分な条件ではないことに気づきませんでした。数(6以外)が完全である...
ええと...平均して9分の1の偶数がこの条件を満たす場合、私のアルゴリズムは確かに数が多すぎる完全数を見つけるでしょう;-)。
自分自身を償還するには、ほとんどの場合、より高価な係数の計算を回避するために、デジタルルートを使用するという提案を維持し、維持しますが、フィルターとしてのみ使用します。
【元々の試み:恥の殿堂】
If the number is even,<br>
compute its [digital root][1].
if the digital root is 1, the number is perfect, otherwise it isn't.
If the number is odd...
there are no shortcuts, other than...
"Not perfect" if the number is smaller than 10^300
For bigger values, one would then need to run the algorithm described in
the question, possibly with a few twists typically driven by heuristics
that prove that the sum of divisors will be lacking when the number
doesn't have some of the low prime factors.
偶数の数字根トリックを提案する私の理由は、これが任意の長さの算術ライブラリ(GMPなど)の助けを借りずに計算できるためです。また、素因数分解や因数分解(2 ^(p-1)*((2 ^ p)-1))よりも計算コストがはるかに低くなります。したがって、インタビュアーが奇数の「完全ではない」応答に満足する場合、ソリューションは非常に効率的であり、ほとんどのコンピューター言語でコード化可能です。
[2回目と3回目の試み...]
If the number is even,<br>
if it is 6
The number is PERFECT
otherwise compute its [digital root][1].
if the digital root is _not_ 1
The number is NOT PERFECT
else ...,
Compute the prime factors
Enumerate the divisors, sum them
if the sum of these divisor equals the 2 * the number
it is PERFECT
else
it is NOT PERFECT
If the number is odd...
same as previously
この比較的奇妙なインタビューの質問について...
私はこの投稿の別の回答に対するandrewdskiのコメントを2番目にしています。この特定の質問は、汎用開発者のインタビューのコンテキストではかなり奇妙です。
多くの面接の質問と同様に、面接官は特定の解決策を求めているのではなく、候補者がさまざまなアプローチの一般的な長所と短所を明確にする能力を示す機会を提供している可能性があります。また、候補者が応答する前にMathWorldやWikipediaなどの一般的なリソースを検索する機会が提供されている場合、これはそこで提供される情報をすばやく理解する能力の良いテストになる可能性があります。