这道题目考察的是素数筛,需要将素数筛选出来。
需要注意的是,此题得要求是找出素数位置,因此需要另开一个数组,将素数位置
挨个保存下来。
有个优化的地方,对于本身是素数的数字直接输出位置就可以了。
但对于本身是合数的数字,由于需要找出其最大的质数因子的位置,为此可以在进行筛选素数的时候对于某个素数的
倍数都将其变为这个素数的位置(因为这个素数是这个合数目前来说的最大因子),而对于以后的素数进行筛选时,
可以将一些之前已经赋值过的合数再次更新。
例:对于6:2先更新,此时6的最大质因子为2,位置为1,
素数3更新,此时3为6的最大质因子,位置为2.
由此,得出以下代码:
1 #include <iostream> 2 using namespace std; 3 const int MAXN = 1000010; 4 int a[MAXN]; 5 void Prime_Shieve(){ 6 int cnt = 0; 7 for(int i = 2; i <= MAXN; i ++){ 8 if(!a[i]){ 9 a[i] = ++cnt; 10 for(int j = 2 * i; j <= MAXN; j += i) 11 a[j] = cnt; 12 } 13 } 14 } 15 int main(){ 16 Prime_Shieve(); 17 int n; 18 while(scanf("%d",&n) != EOF){ 19 printf("%d ", a[n]); 20 }21 return 0; 22 }