patterncppMinor
Find The Triangular Number With More Than N Divisors
Viewed 0 times
numberthewiththanmoredivisorsfindtriangular
Problem
My code is a general solution to the following problem from Project Euler #12:
What is the value of the first triangle number to have over five hundred divisors?
MY CODE
I found my solution to be quite fast for the purposes of the question (it found the first triangular number with over 500 divisors in about .2 seconds). Wondering how I can make it faster, and about any general code suggestions to be made.
What is the value of the first triangle number to have over five hundred divisors?
MY CODE
#include
int generate_triangular(int n);
int enumerate_divisors(int n);
int main()
{
std::cout>user_input;
bool result_found = false;
int test_number = 1;
int target;
while(!result_found){
int factor_count = enumerate_divisors(generate_triangular(test_number));
if(factor_count < user_input){
test_number++;
}else{
result_found = true;
target = generate_triangular(test_number);
}
}
std::cout<<"The "<<test_number<<" th triangular number"<<std::endl;
std::cout<<target<<std::endl;
}
int generate_triangular(int n){
return (n*(n+1))/2;
}
int enumerate_divisors(int n){
int divisor_count = 0;
for(int i = 1;i*i <= n;i++){
if(n%i == 0){
divisor_count++;
}
}
return 2*divisor_count;
}I found my solution to be quite fast for the purposes of the question (it found the first triangular number with over 500 divisors in about .2 seconds). Wondering how I can make it faster, and about any general code suggestions to be made.
Solution
Your naming of variables is hard to reason about. When I think about what your program is doing you, I come up with the following sequence of steps:
Here is how I would restructure your main loop:
Also, add some spaces in between your function declarations, it's hard to read when everything is clumped together. But don't over do it (in particular, don't double space everything).
- Take in a
targetdivisor count.
- Index through each triangular number
nand check if it satisfies the condition.
- If it doesn't increment
nand repeat.
- Once it does print out the results.
Here is how I would restructure your main loop:
std::cout > target;
// Indexes the triangle numbers.
int n = 0;
// Keeps track of how many divisors.
int divisors = 0;
do {
n++;
divisors = enumerate_divisors(generate_triangular(n));
} while (divisors < target);
std::cout << "The " << n <<" th triangular number" << std::endl;
std::cout << generate_triangular(n) << std::endl;Also, add some spaces in between your function declarations, it's hard to read when everything is clumped together. But don't over do it (in particular, don't double space everything).
Code Snippets
std::cout << "You want to find the first triangular number with less than or more than how many divisors? " << std::endl;
int target;
std::cin >> target;
// Indexes the triangle numbers.
int n = 0;
// Keeps track of how many divisors.
int divisors = 0;
do {
n++;
divisors = enumerate_divisors(generate_triangular(n));
} while (divisors < target);
std::cout << "The " << n <<" th triangular number" << std::endl;
std::cout << generate_triangular(n) << std::endl;Context
StackExchange Code Review Q#144982, answer score: 2
Revisions (0)
No revisions yet.