题目描述
求正整数N(N>1)的质因数的个数。 相同的质因数需要重复计算。如120=2*2*2*3*5
,共有5个质因数。
输入描述:
可能有多组测试数据,每组测试数据的输入是一个正整数N,(1<N<10^9)。
输出描述:
对于每组数据,输出N的质因数的个数。
示例1
输入
120
输出
5
思路: 我一开始一直想着怎么判断是否是质数,怎么一直整除同一个质数。各种循环,复杂度飙升。看了大佬的程序才知道,根本不需要判断质数,因为一个整数被完全分解以后,一定全部是由质数组成的因子的!
代码:
#include<iostream>
#include <math.h>
using namespace std;
int main()
{
int m;
int count=0;
while(cin>>m){
for(int i=2;i<sqrt(m);i++)
{
while(m%i==0)
{
count++;
m=m/i;//% 和/ 不要搞混
}
if(m<=1) break;//若最后一个数是1或者0 那么直接跳出结束
}
if(m>1) count++;//若最后一个数大于1,那么一定是一个质数,所以要+1
cout<<count<<endl;
}
return 0;
}
知识点:
- 还是顺便复习一下质数的判断:
bool isprime(int n){
if(n<2){
return false;
}
for(int j=2;j*j<n;j++)
{
if(n%j==0) {return false;}
}
return true;
}
- 看到大佬的代码里面用的是long长整型,但是 int整型也通过了测试,那么到底什么时候需要用long呢?
int和long[int]取值范围是一样的都是2的31次-1,但是在不同系统下占用的字节数不同,long long是2的63次-1。
Reference:
[1] 算法:如何判断一个数是否是质数
[2] int、long和long long的范围
[3] long和int的区别