数字が完璧かどうかを知るには、すべての除数を合計する必要があります。つまり、最初に数字を見つける必要があります。あなたはこれに対して非常にゆっくりしたアプローチを使用しています - 基本的に、候補者の数の半分まで可能なすべての候補者の無理な力です。これには多くの時間がかかり、しばらくすると実行不可能なオプションになります。あなたがチェックしなければならない数字が1'000'000なら、あなたのアプローチは500'000ディビジョンを必要とします。部門は遅いです。あなたはアプローチを変えなければなりません。
各数値が除数であるかどうかを調べるために各数値をテストする必要はありません。これを行うことができます:番号を因数分解し、すべての因子を生成します。
数値を因数分解することは、半分まですべての候補をブルートフォースするよりも信じられないほど速くなる可能性があります。たとえ簡単なアプローチでも、偶数(2を除く)をすべて簡単にスキップすることができ、半分ではなく平方根で停止する必要があります。数が1'000'000の場合は、約500分割、すなわちsqrt(1'000'000)までの奇数が必要です。さらに簡単に改善することができます(素因数の検索を最適化する方法に関する多くの資料があります)。 10年前、「factor.exe」というプログラムが見つかりましたが、今は信頼できるダウンロードを提供することができません(thisまたはthisを見ているかもしれませんが、そこに何があるかを確認していないのであなた自身の責任でダウンロードして実行してください!)、それは1秒未満で60桁の数字を因数分解することができます。 hereは、Javascriptを使用して約0.01秒(平均)で最大20桁の数字を生成するサイトです。これは、数字をいかに早く因数分解することができるかという考え方を与えることに過ぎません。
便利なことにベクトルに格納された素因数を持つと、それらを結合してすべての除数を生成できます。すべての「組み合わせ」は、そのそれぞれについて、それを取るか否かを選択することに対応する。 n
(1を除く)の要因がある場合は、2 nの可能性があります。私は指数関数的な成長は良くありませんが、ほとんどの場合、n
はlong long
に格納できる数値では10を上回る可能性は低いため、限られたセットで作業していることがわかります(これは経験的なことです)。そして繰り返される要因は物事をより速くすることができます(2 は本当に1024の異なる要素につながりません。実際には10個しかありません)。
だから、1'000'000周りの数のために、あなたは簡単で、ほとんどの500の部門とそれを考慮することができ、そしてあなたが10個の素因数を持っている場合は、いくつかの乗算を必要とそれぞれの2 = 1024要因を持つことができます(平均で5)、そして最後にそれらを合計しなければなりません。したがって:500師団、〜5000掛け算、〜1000合計。これはあなたのアプローチで必要とされる500,000区画よりはるかに高速です。
最後に、このアプローチはあなたよりもはるかに高速になる可能性があります。
ここにコードをテキストとして保存してください。オフサイトのイメージリソースにリンクしないでください。 – Filburt
Filburt Filburt私はここに来ました。私は実際にそれをテキストとして配置する方法を知りませんでした。 – Asad
コードを貼り、エディタのテキストボックスにハイライト表示し、 '{}'ボタンを押して整形してください。 – Filburt