算法优化 - 具有n个divisiors的最小数字

Shi*_*vam -1 c++ algorithm

这个问题是一个编程版第12题projecteuler.net ..

通过添加自然数来生成三角数的序列.所以第7个三角形数字是1 + 2 + 3 + 4 + 5 + 6 + 7 = 28.前十个学期将是:

1,3,6,10,15,21,28,36,45,55,...
Run Code Online (Sandbox Code Playgroud)

28号三角形将具有以下因素

28 = 1,2,4,7,28
Run Code Online (Sandbox Code Playgroud)

我们可以看到28是第一个有超过五个除数的三角形数.

超过N个除数的第一个三角形数的值是多少?

(1 <= N <= 1000)

我编写的代码适用于N = 750.但是N = 1000需要很长时间.

#include <iostream>
#include <stdio.h>
#include <vector>

#define LL long long

using namespace std;

int main()
{
    int test;
    scanf("%d",&test);
    int v[10001]={0};
    int tnum=1,num=1;

    while(1)
    {
        int c=0;
        for(int i=1;i*i<=tnum;++i)
        {
            if(tnum%i==0)
            {
                ++c;
                if(i!=(tnum/i))
                {                       
                    ++c;
                }               
            }
        }
        if(v[c]==0)
            v[c]=tnum;

        //  cout << "c = "<<c<<" tnum = " << tnum << endl;
        if(c>1000)
        {
            break;
        }
        ++num;

        tnum += num; 
    }

    while(test--)
    {
        int n;
        scanf("%d",&n);
        ++n;
        while(v[n]==0)
        {
            ++n;
        }
        printf("%d\n",v[n]); 
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

任何帮助或建议将不胜感激.谢谢.

编辑1 =回答这个问题 - 因为我们必须找到具有超过n个divisiors的下一个三角形数字,我们可以强制所有三角形数字并找到它们的divisiors数量.然后我们将看到更大的n值(n> 240)的模式

gna*_*729 5

如果我告诉你938,839有多少除数,938,840有多少除数,你怎么用我给你的信息找出938,839*938,840的除数?

你怎么能用这个想法让你的算法运行速度快100倍?

  • 这不是答案.请在问题之后发表评论. (2认同)
  • @wallyk:不,这比直接回答要好。 (2认同)
  • @neminem:严格来说,这不是一个答案.您可以找到一条规则,说明应将其迁移到评论中.但那是愚蠢的.人们没有解决项目欧拉问题,因为这是他们的工作,或者因为这是他们实际想要做的事情的一些技术挑战; 相反,他们解决体育问题,以便学习或磨练他们解决问题的能力.一个直接的答案就是失败了. (2认同)