题目来源:http://codeup.cn/problem.php?cid=100000592&pid=3
题目描述
输入n个整数,依次输出每个数的约数的个数。
输入
输入的第一行为N,即数组的个数(N<=1000)
接下来的1行包括N个整数,其中每个数的范围为(1<=Num<=1000000000)
当N=0时输入结束。
输出
可能有多组输入数据,对于每组输入数据,
输出N行,其中每一行对应上面的一个数的约数的个数。
样例输入
6 1 4 6 8 10 12 0
样例输出
1 3 4 4 4 6
特别提醒:cout比printf速度慢,容易引起时间超限
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
#include <fstream>
#include <string>
#include <cmath>
#include <algorithm>
#include <queue>
#include <map>
using namespace std;
#define nMAX 100000
int prime[nMAX];
int num;//num:质数列表的长度
bool NoP[nMAX];
#define LEN 100
void Find_Prime_Table(int n){
memset(NoP,0,sizeof(NoP));
num=0;
for(int i=2;i<=nMAX;i++){
if(!NoP[i]){
prime[num++]=i;
if(num>n)
break;
for(int j=i*2;j<=nMAX;j+=i){
NoP[j]=true;
}
}
}
}
struct factor{
int n,cnt;
}F[LEN];
int main()
{
Find_Prime_Table(LEN);
int N;
while (EOF != scanf("%d",&N) && N)
{
while (N--)
{
memset(F,0,sizeof(factor)*LEN);
int t,n=0;
scanf("%d", &t);
if(t==0 || t==1){
cout<<t<<endl;
continue;
}
int sqrt_t=(int)sqrt(t*1.0);
for(int i=0;i<num && prime[i]<=sqrt_t;i++){
if(t%prime[i]==0){
F[n].cnt=0;
F[n].n=prime[i];
while(t%prime[i]==0){
F[n].cnt++;
t/=prime[i];
}
n++;
}
if(t==1)break;
}
if(t>1){
F[n].n=t;
F[n].cnt=1;
n++;
}
int ans=1;
for(int i=0;i<n;i++){
ans*=(F[i].cnt+1);
}
printf("%d\n",ans);
}
}
return 0;
}