プロジェクトオイラーの問題12問題の解決

非常に割り切れる三角数

三角形の数のシーケンスは自然数を加算することにより生成されます。7三角形の数はであろうように、1 + 2 + 3 + 4 + 5 + 6 + 7 = 28第10項は次のようになります。

1、3、6、10、15、21、28、36、45、55、...
私たちは最初の7つの三角形の数の要素をリストしてみましょう。

  • 1:1
  • 3:1,3
  • 6:1,2,3,6-
  • 10:1,2,5,10
  • 15:1,3,5,15
  • 21:1,3,7,21
  • 28:1,2,4,7,14,28

私たちは、28が5以上の約数を持つ最初の三角形の数であることがわかります。

最初の三角形の数の値が500件の除数の上に何を持っているのですか?

略三角形の数の高さ

列の数を加えることにより1三角数は自然数で生成されます。例えば、三角形の数は7 + 2 + 3 + 4 + 5 + 6 + 7 = 28です。フロント三角数の10列は以下のとおりです。

1、3、6、10、15、21、28、36、45、55、...
私たちは最初の7つの三角形番号の数についての全てを列挙してみましょう。

  • 1:1
  • 3:1,3
  • 6:1,2,3,6-
  • 10:1,2,5,10
  • 15:1,3,5,15
  • 21:1,3,7,21
  • 28:1,2,4,7,14,28

私たちは、28が5つの除数を超える三角形の数を持っている最初のものであることがわかります。

最初の三角形の数は500以上の除数が数ですか?

問題解決のためのアイデア

\(1 \) すべての番号を列挙どのように多くのそれの除数を決定するために始めました。

約数の存在を決定(O(\ SQRT {N \ })\) :アルゴリズムの時間複雑性を

我々は、から見ることができる(1 \)\\(\ lfloor \ SQRT {N } \ rfloor \) 毎に数列挙する\(I \)であれば、\(I \)割り切れる\(N- \)次に、\ (\ FRAC {N} {iは } \) 分割することができる\(N- \)

コードは、(CAL(n)は除数の数nを返す場合)として、以下のとおりです。

#include <bits/stdc++.h>
using namespace std;
int cal(long long n) {
    int cnt = 0;
    for (long long i = 1; i*i <= n; i ++) {
        if (n % i == 0) {
            if (i*i == n) cnt ++;
            else cnt += 2;
        }
    }
    return cnt;
}
int main() {
    int n = 0;
    for (long long i = 1; ; i ++) {
        n += i;
        if (cal(n) > 500) {
            cout << n << endl;
            break;
        }
    }
    return 0;
}

お答えします(76576500 \)\

おすすめ

転載: www.cnblogs.com/quanjun/p/12323196.html