关于这个问题最容易想到的就是求出其个约数并对其进行一一计数了。这里附上稍微优化的代码,不再赘述。
#include<stdio.h>
#include<math.h>
int main()
{
int n,num,i,cnt;
double tmp;
while(~scanf("%d",&n)&&n!=0)
{
while(n--)
{
scanf("%d",&num);
tmp=sqrt(num);
cnt=0;
for(i=1;i<tmp;i++)
if(num%i==0)
cnt++;
i=(int)tmp; /*这一步不可少的,thingking...*/
if(i*i==num)
cnt=2*cnt+1;
else cnt*=2;
printf("%d\n",cnt);
}
}
return 0;
}
这里我们给出根据约数个数定理求解此问题的方法,关于约数个数定理大家可以参考百度百科上的说明(约数个数定理),由此得将n分解成各质因数的乘积即n=p1^a1*...*pk^ak,n的约数个数为(a1+1)*...*(aK+1),据此思想附上比上面一一计数方法时间复杂度优化很多的代码如下:
#include<stdio.h>
#include<math.h>
int main()
{
int n,num,i,cnt,flag,res;
while(~scanf("%d",&n)&&n!=0)
{
while(n--)
{
scanf("%d",&num);
i=2;
cnt=1;
res=1;
flag=0;
while(i*i<=num)
{
if(num%i==0)
{
cnt++;
flag=1;
num/=i;
}
else
{
if(flag)
{
res*=(cnt+1);
cnt=0;
flag=0;
}
i++;
}
}
if(num==i) res*=(cnt+1);
else if(flag) res*=cnt*2;
else if(num>i)res*=2; /*n=2,3时*/
else res=1; /*n==1*/
printf("%d\n",res);
}
}
return 0;
}
第一种方法的时间复杂度为O(n),第二种方法的时间复杂度为O(logn)。