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

时间:2014-07-18 22:19:56

标签: c++ algorithm

此问题是来自Problem 12的<{3}}的编程版本。

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

1,3,6,10,15,21,28,36,45,55,...

三角形数字28将具有以下因素

28 = 1,2,4,7,28

我们可以看到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;
}

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

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

的较大值的模式

1 个答案:

答案 0 :(得分:5)

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

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