求解出某个数的素因数的个数,包括重复的素因数
// 2019.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
bool mark[100001];
int prime[100001];
int primeSize;
// 素数刷选法选择出0-100000的素数
void init()
{
primeSize = 0;
for (int i = 2; i <= 100000; i++)
{
if (mark[i] == true)
continue;
prime[primeSize++] = i;
if (i >= 1000)
continue;
for (int j = i*i; j <= 100000; j += i)
{
mark[j] = true;
}
}
}
int main()
{
init();
int n;
while (scanf_s("%d", &n) != EOF)
{
// 按顺序保存分解出的素因数
int ansPrime[30];
// 分解出的素因数的个数
int ansSize = 0;
// 保存分解出来的素因数对应的幂指数
int ansNum[30];
// 依次测试每一个素数
for (int i = 0; i < primeSize; i++)
{
// 若该素数能整除被分解的数,那么该素数就是其素因数
if (n % prime[i] == 0)
{
ansPrime[ansSize] = prime[i];
// 初始化该素数的幂指数为0
ansNum[ansSize] = 0;
// 从被测试数重将该素数分解出来,然后统计其幂指数
while (n % prime[i] == 0)
{
ansNum[ansSize]++;
n /= prime[i];
}
// 素因数的个数增加
ansSize++;
// 如果已经被分解成1, 则提前终止
if (n == 1)
break;
}
}
// 如果经过以上的处理后仍然n不为1,则表明存在大于100000的数是n的素因数
// 利用素数平方根求解法知道如果存在也就只能存在一个
if (n != 1)
{
ansPrime[ansSize] = n;
ansNum[ansSize++] = 1;
}
int ans = 0;
for (int i = 0; i < ansSize; i++)
{
ans += ansNum[i];
}
printf("%d\n", ans);
}
return 0;
}