执行结果:通过
执行用时和内存消耗如下:


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 意味着计算"非特殊"的数量,即不是质数平方的数量。