质因数个数 c++

描述

题目描述
求正整数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);
    }
}

猜你喜欢

转载自blog.csdn.net/BeforeEasy/article/details/81431319