版权声明:假装有个原创声明……虽然少许博文不属于完全原创,但也是自己辛辛苦苦总结的,转载请注明出处,感谢! https://blog.csdn.net/m0_37454852/article/details/88312235
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int MAX = 100010;
int N, X;
int p[MAX] = {0};
int Prime[MAX] = {0}, cnt = 0;
void findPrime(int x)//埃式筛法求素数表
{
for(int i=2, j; i<MAX; i++)
{
if(!p[i])
{
Prime[cnt++] = i;
for(j = i+i; j<MAX; j += i) p[i] = 1;
}
}
}
int main()
{
findPrime(MAX);
while(scanf("%d", &N) != EOF)
{
for(int k=0; k<N; k++)
{
scanf("%d", &X);
int sum = 1, num = 0;
int sqr = (int)sqrt(1.0*X);
for(int i=0; Prime[i]<=sqr; i++)
{
num = 0;
while(X%Prime[i] == 0)//若该质数是其因子,则求其个数
{
num++;//
X /= Prime[i];
}
sum *= num+1;//其因子个数等于所有质因子个数+1的累成
}
if(X != 1) sum *= 2;//若最后X不为1,说明还有一个大于sqr的质因子
printf("%d\n", sum);
}
}
return 0;
}