描述
题目描述
求正整数N(N>1)的质因数的个数。 相同的质因数需要重复计算。如120=2*2*2*3*5,共有5个质因数。
输入描述:
可能有多组测试数据,每组测试数据的输入是一个正整数N,(1< N< 10^9)。
输出描述:
对于每组数据,输出N的质因数的个数。
示例1
输入
120
输出
5
分析
合数都可以分解成质因数相乘的格式。
一种简单的分解质因数代码为,从最小的质数开始遍历,每次找到之后就回退一个数,代码如下:
void practice(long long n)
{
int res = 0;
for (long long x = 2; x <= n; x++)
{
if (n%x == 0)
{
n /= x;
x--;
res++;
}
}
cout << res << "\n";
}
这道题这个代码只能通过95%的样例,因为会超时
所以最终还是要先筛选一遍素数然后再判断,但是10^9的数组是开不到那么大的,不需要那么大的素数,因为一个数的质因数若有一个>sqrt(n),那也只会有一个,所以只需要再过完所有不到sqrt(n)的质数后仍然n!=1的情况下加一,因为这个时候有且仅有一个质因数了
代码
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
const int maxx = 100003;
int isprime[100003];
void Prime()
{
for (int i = 0; i < maxx; i++)isprime[i] = 1;
for(int x = 2;x<=maxx;x++)
{
if (isprime[x])
{
for (int j = x * 2; j <= maxx; j += x)isprime[j] = 0;
}
}
}
void practice(long long n)
{
int res = 0;
for (int i = 2; i < maxx; i++)
{
if (isprime[i])
{
if (n%i == 0)
{
res++;
n /= i;
i--;
}
}
}
if (n != 1)res++;
cout << res << "\n";
}
int main()
{
long long n;
Prime();
while (cin>>n)
{
practice(n);
}
}