1. 程式人生 > >Project Euler Problem 12

Project Euler Problem 12

Problem 12 : 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?

#include <iostream>
#include <cassert>
#include
<cmath>
using namespace std; class PE0012 { private: int getTriangleNumber(int n); public: int getFactorsOfNumber(int number); int findTriangleNumberByFactors(const int numberOfDivisors); }; int PE0012::getTriangleNumber(int n) { int num = n*(n+1)/2; return num; } int
PE0012::getFactorsOfNumber(int number) { int numberOfFactors = 0; double squareRoot = sqrt((double)number); for(int i=1;i<=(int)squareRoot;i++) { if (number % i == 0) { numberOfFactors++; if (number / i != i) { numberOfFactors++; } } } return numberOfFactors; } int PE0012::findTriangleNumberByFactors(const int numberOfDivisors) { int sequence = 7; // 28 int triangleNumber; int numberOfFactors = 6; // 28: 1,2,4,7,14,28 while (numberOfFactors < numberOfDivisors) { sequence++; triangleNumber = getTriangleNumber(sequence); numberOfFactors = getFactorsOfNumber(triangleNumber); } return triangleNumber; } int main() { PE0012 pe0012; assert(6 == pe0012.getFactorsOfNumber(28)); cout << "The first triangle number " << pe0012.findTriangleNumberByFactors(500); cout << " has over five hundred divisors." << endl; return 0;