又是一道有关素数的题,这回找的是半素数,即除了1和本身外,只有两个素数因子。由于数据量大(2<N<1000 000),所以如果将每个测试数据都做因式分解,一定会出现超时错误。
基本思路是建立一个[2,1000 000]范围内的半素数表,读入数据,直接检索。
为了解决这个问题,我们继续使用造福人类的STL——vector & set,分别用来存储素数和半素数。为什么素数的存储不用set呢?因为我们的终极目标不是判断素数,而是半素数。采用vector存储素数有利于线性查找,在for循环中,可直接根据下标遍历素数表。而采用set存储半素数,是因为set是平衡检索二叉树,可以将元素自动排序,检索速度最快。
这里再复习一下素数的判断方法:首先排除2以外的所有偶数,然后从奇数中排除素数的倍数,剩下的就是素数。