已知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; }