HiveBrain v1.2.0
Get Started
← Back to all entries
patterncppMinor

Find The Triangular Number With More Than N Divisors

Submitted by: @import:stackexchange-codereview··
0
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

#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:

  • Take in a target divisor count.



  • Index through each triangular number n and check if it satisfies the condition.



  • If it doesn't increment n and 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.