题目来源:蓝桥杯2022初赛 C++ G组C题
题目描述
给定正整数n,请问有多少个质数是n的约数。
输入格式
输入的第一行包含一个整数n。
对于30% 的评测用例,1≤n≤10000。
对于60% 的评测用例,1≤n≤10^9。
对于所有评测用例,1≤n≤10^16。
输出格式
输出一个整数,表示n 的质数约数个数。
输入样例
396
输出样例
3
数据范围与提示
396 有2, 3, 11 三个质数约数。
问题分析
用试除法来实现质数因子的分解。
为了提高速度,质数2单独考虑,大致可以减少一半的时间。
然后,用3开始的奇数去试除。
程序说明
对于除以已知因子后的n,用条件"i <= sqrt(n)"来限制试除的范围,即只用小因子来试除,可以减少计算量,没有这个条件则会超时。剩下的超过n平方根的大因子直接计数。
AC的C语言程序如下:
/* LQ0015 质因数个数 */
#include
#include
typedef long long ll;
int main()
{
long long n;
int cnt = 0;
scanf("%lld", &n);
if (n % 2 == 0) {
cnt++;
while (n % 2 == 0)
n /= 2;
}
for (int i = 3; i <= sqrt(n) && n > 1LL; i += 2)
if (n % i == 0) {
cnt++;
while (n % i == 0)
n /= i;
}
if (n > 1) cnt++;
printf("%d\n", cnt);
return 0;
}