执行结果:通过
执行用时和内存消耗如下:
bool isPrime(int n){
if(n<2){
return false;
}
for(int i=2;i*i<=n;i++){
if(n%i==0){
return false;
}
}
return true;
}
int nonSpecialCount(int l, int r) {
int p=sqrt(l);
int q = sqrt(r);
int len = r-l+1;
for(int i = p; i <=q; i++) {
if(isPrime(i)&&i*i>=l) {
len--;
}
}
return len;
}
解题思路:
这段代码主要包含两个函数:isPrime
和 nonSpecialCount
。下面分别解释这两个函数的思路。
isPrime
函数
这个函数用于判断一个整数 n
是否为质数。
- 判断边界条件 :
- 如果
n
小于 2,直接返回false
,因为质数定义为在大于 1 的自然数中,除了 1 和它本身以外不再有其他因数的数。
- 如果
- 检查因数 :
- 从 2 开始,一直到
sqrt(n)
(即n
的平方根),逐个检查是否存在能够整除n
的数。 - 如果在这个范围内找到了一个数
i
,使得n % i == 0
,说明n
不是质数,返回false
。 - 如果循环结束都没有找到这样的
i
,说明n
是质数,返回true
。
- 从 2 开始,一直到
注意 :只需要检查到 sqrt(n)
是因为如果一个数 n
不是质数,那么它必有一个因子不大于它的平方根。
nonSpecialCount
函数
这个函数用于计算在区间 [l, r]
内,有多少个整数不是某个质数的平方。
- 计算区间长度 :
- 首先计算区间
[l, r]
的长度len
,即r - l + 1
。
- 首先计算区间
- 确定质数平方的范围 :
- 计算
l
和r
的平方根,分别为p
和q
。 - 只需要考虑
[p, q]
范围内的质数,因为在这个范围外的质数的平方要么小于l
,要么大于r
,不在考虑范围内。
- 计算
- 检查质数平方 :
- 遍历
[p, q]
范围内的每个整数i
,使用isPrime
函数判断i
是否为质数。 - 如果
i
是质数且i * i
在区间[l, r]
内,说明这个质数的平方在区间内,因此len
需要减一。
- 遍历
- 返回结果 :
- 最后返回调整后的
len
,即区间[l, r]
内不是某个质数平方的整数个数。
- 最后返回调整后的
注意 :这里的"特殊"指的是某个质数的平方,而函数名 nonSpecialCount
意味着计算"非特殊"的数量,即不是质数平方的数量。