求正约数个数

已知n=p1^a1*p2^a2…*pk^ak,(也就是n的素数分解),求n的约数个数。

分析:n的约数一定包含素因子中的某几项,对于n的某个素因子pi,它在约数中的指数可以是0,1,2…ai共ai+1种情况,

根据乘法原理: n的约数个数=(a1+1)*(a2+1)…*(ak+1)

自己写的代码如下:
#include<iostream>//求n以内的公约数的个数
using namespace std;
#include<string.h>
#include<math.h>
#define M 10000
int p[M],a[M+1],b[M],c[M];
void prime()//求M以内的素数
{
    int i,j,m,k=0;
    memset(a,0,sizeof(a));
    m=(int)(sqrt(M*1.0));
    for(i=2;i<=m;i++)
    {
        if(!a[i])
        {
            p[k++]=i;
            for(j=i*i;j<=M;j+=i)//j<=M 注意前面应定义为 a[M+1]
             a[j]=1;
        }
    }
    for(i=m+1;i<=M;i++)
    {
        if(!a[j])
        p[k++]=i;
    }
    //for(i=0;i<100;i++)测试数据
    //printf("%d ",p[i]);
}
int main()
{
    prime();
    while(1)
    {
    int n,i,k=0,k1=0,s=1;
    memset(c,0,sizeof(c));
    cin>>n;
    for(i=0;p[i]*p[i]<=n;i++)
    {
        if(n%p[i]==0)
        {
            b[k++]=p[i];
            c[k1]++;
            n/=p[i];
            while(n%p[i]==0)
            {
                c[k1]++;
                n/=p[i];
            }
            k1++;
        }
        if(n==1)break;
    }
    if(n>1)
    {
        b[k++]=n;
        c[k1]++;
        k1++;
    }
    for(i=0;i<k1;i++)
    {
        s=s*(c[i]+1);
    }
    cout<<s<<endl;    
    }
    return 0;
}

 

 

posted @ 2012-04-21 14:43  龙杉老师  阅读(991)  评论(0编辑  收藏  举报