约数个数
Description
给一个整数N(N<=1,000,000,000),求它的所有约数的个数。
Input
多个N
Output
答案
Sample Input
1
2
12
2
12
Sample Output
1
2
6
2
6
Source
DYGG's contest 2- Big John
代码:
根据约数素数定理:
代码C:
# include <stdio.h>
# include <math.h>
# define N 31650 //N*N约等于1 000 000 000
# define M 3410 //0--N之间的质数 为3401个
char A[N];
int B[M];
int main()
{
int i,j,k=0,n,Q=sqrt(N)+1;
for(i=2;i<Q;i++)//改进的埃氏筛法 复杂度:0(sqrt(N)*log(log(N)))
if(!A[i])for(B[k++]=i,j=i*i;j<N;j+=i)
A[j]=1;
do{ if(!A[i]) B[k++]=i; }while(++i<N); //O(N-sqrt(N))
while(~scanf("%d",&n))
{
Q=1; k=sqrt(n)+1;
for(i=0;B[i]<k;i++)
{
for(j=0;n%B[i]==0;n/=B[i])
j++;
if(j)Q=Q*(j+1);
if(n==1)break;
}
if(n!=1)Q<<=1;
printf("%d\n",Q);
}
return 0;
}
# include <stdio.h>
# include <math.h>
# define N 31624 //N*N约等于1 000 000 000
# define M 3402 //0--N之间的质数 为3401个
char A[N];
int B[M],Q;
int main()
{
int i,j,n;
for(i=2,Q=sqrt(N)+1;i<Q;i++)//改进的埃氏筛法 复杂度:0(sqrt(N)*log(log(N)))
if(!A[i])for(B[++B[0]]=i,j=i*i;j<N;j+=i)
A[j]=1;
do{ if(!A[i]) B[++B[0]]=i; }while(++i<N); //O(N-sqrt(N))
while(~scanf("%d",&n))
{
Q=1;
for(i=1;i<=B[0];i++)
{
for(j=0;n%B[i]==0;n/=B[i])
j++;
if(j)Q=Q*(j+1);
if(n==1)break;
}
if(n!=1)Q<<=1;
printf("%d\n",Q);
}
return 0;
}