我引用了一位用户的求调贴:
#include<bits/stdc++.h>
using namespace std;
bool zs(int n){
int i;
for(i=2;i<=sqrt(n);i++){
if(n%i==0)
return false;
}
return true;
}
bool hw(int n){
if(n%2==0)
return false;
int i=0, l=n;
while(l){
i=i*10+l%10;
l/=10;
}
if(i!=n)
return false;
else if(zs(n))
return true;
else
return false;
}
int main(){
int a, b;
cin>>a>>b;
for(;a<=b;a++)
if(hw(a))
cout<<a<<'\n';
return 0;
}
以下是错误点:
素数判断函数 zs 的缺陷:
未处理 n ≤ 1 的情况,会将 0、1 错误判定为素数
循环条件 i <= sqrt(n) 每次循环都计算平方根,效率较低,建议提前计算:int limit = sqrt(n); for(i=2; i<=limit; i++)
对于 n=2 这种特殊素数,会正确返回 true,但后续会被 hw 函数错误过滤
回文判断函数 hw 的逻辑问题:
开头 if(n%2==0) return false 错误排除了唯一的偶素数 2(2 是回文素数但会被过滤)
函数内部再次调用 zs(n) 进行素数判断,导致重复计算,影响效率
回文判断逻辑本身正确,但可以简化为 return i == n
输入与边界处理:
未处理 a > b 的异常输入情况
未限制输入范围,当 b 过大时(如超过 1e6)会明显卡顿
缺少对负数的处理(负数不可能是素数)
性能优化空间:
可以先筛出区间内的所有素数,再从中筛选回文数,减少重复计算
回文数判断可以转换为字符串处理,更直观易懂
代码可读性:
函数名和变量名使用拼音缩写(zs、hw),建议改为有意义的英文名称(isPrime、isPalindrome)
缺少必要的注释和代码格式化
关注我