这个向量数组代码有什么作用? (C ++)

时间:2016-12-07 08:46:31

标签: c++ arrays vector

很难找到解释。

这段代码有什么作用?据我所知,它会创建一个矢量数组,但这就是它。 如何打印矢量数组和访问元素以进行实验?

 #define MAXN 300009
 vector<int>dv[MAXN];
 int main()
 {
  for(int i=1;i<MAXN;i++)
    for(int j=i;j<MAXN;j+=i)
        dv[j].push_back(i);
 }

1 个答案:

答案 0 :(得分:0)

代码很容易进行检测。它最终产生的现实是一个非常简单的(非常低效)Sieve of Eratosthenes。理解该算法后,您将看到此代码可以产生什么样的效果。

编辑:它也是一个因子表生成器。请参阅下面的编辑。

随后检测代码并转储输出,并减少循环次数以简化,我们有类似下面的代码。我们使用range-based-for循环来枚举向量数组中的每个向量:

#include <iostream>
#include <vector>

#define MAXN 20
std::vector<int>dv[MAXN];

int main()
{
    for(int i=1;i<MAXN;i++)
    {
        for(int j=i;j<MAXN;j+=i)
            dv[j].push_back(i);
    }

    for (auto const& v : dv)
    {
        for (auto x : v)
            std::cout << x << ' ';
        std::cout << '\n';
    }
}

结果输出为:

1 
1 2 
1 3 
1 2 4 
1 5 
1 2 3 6 
1 7 
1 2 4 8 
1 3 9 
1 2 5 10 
1 11 
1 2 3 4 6 12 
1 13 
1 2 7 14 
1 3 5 15 
1 2 4 8 16 
1 17 
1 2 3 6 9 18 
1 19 

现在,请注意每个只有两个元素的向量(1和另一个数字)。第二个数字是 prime 。在我们的测试用例中,这些双元素向量是:

1 2 
1 3 
1 5 
1 7 
1 11 
1 13 
1 17 
1 19 

简而言之,这是一种非常简单且极其低效的查找素数的方法。输出循环稍微改变以仅输出长度为2的所有向量的第二个元素,因此将生成低于MAXN的所有素数。因此,使用:

for (auto const& v : dv)
{
    if (v.size() == 2)
        std::cout << v[1] << '\n';
}

我们将从[2...MAXN)

获取所有素数

编辑:生成因子表

如果不是很明显,每个向量都有一个结束元素(不一致地也与外部数组的下标对齐)。所有前面的元素构成了该数字的积极因素。例如:

1 2 5 10 

dv[10]向量,告诉您10有因子1,2,5,10。同样地,

1 2 3 6 9 18 

dv[18]向量,告诉您18有因子1,2,3,6,9,18

简而言之,如果有人想知道某些数字N的所有因素,那么&lt; MAXN,这是将所有信息整理成表格形式的一种方式。