很难找到解释。
这段代码有什么作用?据我所知,它会创建一个矢量数组,但这就是它。 如何打印矢量数组和访问元素以进行实验?
#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);
}
答案 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
,这是将所有信息整理成表格形式的一种方式。