进食后人(if you are 0 pts)
查看原帖
进食后人(if you are 0 pts)
1731656
lyx20131111楼主2025/8/3 21:57

警 示 后 人

JING SHI HOU REN

我引用了一位用户的求调贴:

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

这些错误也有很多用户犯

关注我

2025/8/3 21:57
加载中...