题目链接
个人思路
根据算术基本定理,每个大于1的数都可以写成若干质数相乘的形式。因此,我们从小到大依次求出这个数可能存在的质因数。
参考代码
Java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long n = sc.nextLong();
long res = 0;
long limit = (long) Math.sqrt(n);
for (long i = 2; i < limit; ++i) {
long cnt = 0;
while (n % i == 0) {
// 当前i一定是一个质数,因为比他小的因数都已经被分解成其他更小的质数了
++cnt;
n /= i;
}
if (cnt > 0) ++res;
}
if (n > 1) ++res; // 剩下最后一个因子也是质数
System.out.println(res);
}
}
C/C++
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ll n, res = 0;
cin >> n;
ll count = sqrt(n);
for (ll i = 2; i < count; ++i)
{
ll cnt = 0;
while(n % i == 0)
{ // 当前i一定是一个质数,因为比他小的因数都已经被分解成其他更小的质数了
++cnt;
n /= i;
}
if(cnt > 0) ++res;
}
if(n > 1) ++res; // 剩下最后一个因子也是质数
cout << res;
return 0;
}