/*
约数的个数:
给出正整数n的唯一分解式n = p1^a1*p2^a2*p3^a3...pk^ak,求n得正约数的个数
分析:
这里的正约数其实是被除数
对于某个素因子pi,它的指数的可能性共有0,1,2,...,ai共ai+1种,
因此正约数的个数=(a1+1)(a2+1)...(ai+1)
12 = 2^2*3^1
56 = 2^3*7^1
输入:
12
56
2
1
输出
6
8
2
0
*/
#include <stdio.h>
#include <string.h>
#include <math.h>
#define MAXSIZE 100000
int iArr[MAXSIZE];
int iNum[MAXSIZE];
void isPrime()
{
memset(iArr,0,sizeof(iArr));
for(int i = 2 ; i < MAXSIZE; i++)
{
if(!iArr[i])
{
for(int k = i * i ; k < MAXSIZE ; k += i)
{
iArr[i] = 1;
}
}
}
}
int divide(int n)
{
if(n <= 1)
{
return 0;
}
memset(iNum,0,sizeof(iNum));
//int k = (int)sqrt(n + 0.5);
bool isFinish = false;
int i;
for(i = 2 ; i <= n;i++)
{
while( n % i == 0)
{
if(n == 1)//如果n已经变成1,说明已经全部分解结束
{
isFinish = true;
break;
}
n /= i;
iNum[i]++;
}
if(isFinish)
{
break;
}
}
int iTotalNum = 1;
for(int j = 2; j <= i ; j++)
{
iTotalNum *= (iNum[j]+1);
}
return iTotalNum;
}
void process()
{
int n;
while(EOF != scanf("%d",&n))
{
printf("%d\n",divide(n));
}
}
int main(int argc,char* argv[])
{
process();
getchar();
return 0;
}
算法竞赛入门经典:第十章 数学概念与方法 10.8约数的个数
最新推荐文章于 2023-01-24 14:01:48 发布