Project Euler Problem 12
阿新 • • 發佈:2018-11-11
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;