首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >寻找大于N个除数的三角数

寻找大于N个除数的三角数
EN

Code Review用户
提问于 2016-10-23 04:53:04
回答 2查看 181关注 0票数 4

我的代码是欧拉#12项目中以下问题的通用解决方案:

有五百多个除数的第一个三角形数的值是多少?

我的代码

代码语言:javascript
复制
#include <iostream>
int generate_triangular(int n);
int enumerate_divisors(int n);
int main()
{
    std::cout<<"You want to find the first triangular number with less than or more than how many divisors? "<<std::endl;
    int user_input;
    std::cin>>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;
}

就这个问题而言,我发现我的解是相当快的(它找到了第一个三角形数,大约在.2秒内有超过500个除数)。想知道如何使它更快,以及任何一般性的代码建议将被提出。

EN

回答 2

Code Review用户

回答已采纳

发布于 2016-10-23 05:19:32

您对变量的命名很难推理。当我考虑到您的程序正在做什么时,我提出了以下步骤:

  1. 接受target除数。
  2. 对每个三角数n进行索引,并检查它是否满足条件。
  3. 如果它不增加n和重复。
  4. 一旦它打印出结果。

下面是我如何重组您的主循环:

代码语言:javascript
复制
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;

此外,在函数声明之间添加一些空格,当所有的内容都集中在一起时,很难读懂。但不要做得太多(特别是,不要把所有的空间都翻一番)。

票数 2
EN

Code Review用户

发布于 2016-10-23 06:11:40

如果enumerate_divisors(n)是一个完美的平方,那么n会给出一个错误的结果。

注意,这个问题要求一个有超过500个除数的三角形数,所以您必须输入501来执行所需的计算。

我同意@Dair,你的主回路是复杂的。特别是,result_found是一个标志变量,您应该构造您的循环以消除标志变量。我会这样写:

代码语言:javascript
复制
int divisor_threshold = …;
int i;
long t;
for (i = 1; divisor_count(t = triangular(i)) <= divisor_threshold; i++);
std::cout << "The " << i << "th triangular number " << t
          << " has over " << divisor_threshold << " divisors.\n";
票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/144982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档