质因数的个数

题目描述

求正整数N(N>1)的质因数的个数。相同的质因数需要重复计算。如120=2*2*2*3*5,共有5个质因数。

输入描述:

可能有多组测试数据,每组测试数据的输入是一个正整数N,(1<N<10^9)。

输出描述:

对于每组数据,输出N的质因数的个数。
示例1

输入

120

输出

5

思路

1)题目需要多组测试用例,我的第一个想法是没能每个测试用例都去判断质数,所以可以使用打表法,把100000以内的质数标记出来

2)因为c++中的数组不能太大(同时也是考虑到题目有内存要求),标记的质数表不能全部包含所有可能的输入数据的质因数,这里就有一个小技巧:如果输入的数据n已经和2到n的开方之前的质数计算后,剩余不为1,则表示还存在一个大于质数表内的质数

#include<stdio.h>
#include<math.h>
#define maxSize 100000
int a[maxSize]= {0};//用于存储质数表,下标即为该数值,当数组值为0代表为质数,1为非质数
int main()
{
    //使用筛选法
    for(int i=2; i<10; i++)
        {
            for(int j=i*i; j<maxSize; j+=i)
            {
                a[j]=1;
            }
        }

    int n,sum,temp;//sum存放质因数个数
    while(scanf("%d",&n)!=EOF)
    {
        if(n<maxSize&&a[n]==0){//当输入的数小于数组的最大值,且对应数组值为0,即该数为质数
            printf("1\n");
            continue;
        }
        sum=0,temp=n;
        for(int i=2;i<=sqrt(n)+1;i++)//在2到该数的开方值范围内的质数表中进行计算
        {
            if(!a[i]){
                while(!(temp%i))
                {
                    sum++;
                    temp/=i;
                }
            }

        }
        if(temp!=1) sum++;//如果temp计算后的值不为1,代表剩余的值是一个大于质数表内的质数
        printf("%d\n",sum);
    }

}

思路升级

其实不需要再循环里判断i是为为质数,如果i是合数,则一定不会被整除:那前面的质数一定已经合数中包含的质数被整除过了

#include <iostream>
#include <math.h>
using namespace std;
int main(){
    int n;
    while(cin>>n){
       int i,count=0;
       for(i=2;i<=sqrt(n);i++){
           while(n%i==0){
               count++;
               n/=i;
           }
           if(n<1) break;
       }
       if(n>1) count++;
       cout<<count<<endl;
    }
    return 0;
}

阅读更多

扫码向博主提问

刘_杨

非学,无以致疑;非问,无以广识
去开通我的Chat快问
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页