约数个数

约数个数

点击打开题目:PID=1014

Description


给一个整数N(N<=1,000,000,000),求它的所有约数的个数。

Input


多个N

Output


答案

Sample Input


1
2
12

Sample Output


1
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;
}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值