Project Euler question 12 problem solution

Highly divisible triangular number

The sequence of triangle numbers is generated by adding the natural numbers. So the 7th triangle number would be 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28. The first ten terms would be:

1, 3, 6, 10, 15, 21, 28, 36, 45, 55, …
Let us list the factors of the first seven triangle numbers:

  • 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

We can see that 28 is the first triangle number to have over five divisors.

What is the value of the first triangle number to have over five hundred divisors?

Number height of approximately triangular

Triangular number by one by adding the number of columns is generated by a natural number. For example, the number of triangles is a 7 + 2 + 3 + 4 + 5 + 6 + 7 = 28. Front triangular number ten columns are:

1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...
let us enumerate all about the number of the first seven triangle numbers:

  • 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

We can see that 28 is the first to have the number of triangles over five divisors.

The first triangle number has more than 500 divisor is the number?

Problem-solving ideas

From \ (1 \) began to enumerate every number, determine how many it divisor.

Determining the presence of a number about \ (O (\ sqrt {n }) \) algorithm time complexity:

We can see from \ (1 \) to \ (\ lfloor \ sqrt {n } \ rfloor \) to enumerate every number \ (I \) , if the \ (I \) divisible \ (n-\) , then \ (\ frac {n} {i } \) can be divisible \ (n-\) .

Codes are as follows (where CAL (n) Returns the number n of the divisor):

#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;
}

Get answers to \ (76,576,500 \) .

Guess you like

Origin www.cnblogs.com/quanjun/p/12323196.html