29~~

错误的:

while(T--)
{
scanf("%d",&n);

if(n2||n%20)
printf("No\n");
for(int i=3;i<=sqrt(n);i+=2)
{
if(n%i==0)
printf("No\n");
}
printf("Yes\n");
}
return 0;

正确:

while(T--)
{
scanf("%d",&n);
int is_prime=0;
if(n<=1||n%20)
is_prime=0;
if(n
2)
is_prime=1;
for(int i=3;i<=sqrt(n);i+=2)
{
if(n%i==0)
is_prime=0;
break;//提前退出循环,减少计算
}
//在for循环外,代表每个i都遍历过了
printf("%s\n",is_prime? "Yes":"No");//最后统一输出结果
}
return 0;

bug:
2. 所有情况的输出逻辑混乱:
原代码在多个分支打印No ,最后又统一打印 Yes ,导致结果重复或矛盾(如n=2的输出重复:
原代码中,n=2满足 if(n2||n%20) ,会先输出 No ,但后续又执行  printf("Yes\n") ,导致输出  NoYes (错误)。

收获:修复思路:用「标志位」统一判断定义  is_prime  标志位,初始假设为质数( 1 )。通过条件判断和循环,逐步推翻假设(发现因数则设为  0 )。

posted @ 2025-07-10 07:49  ervgiu28hg34y827  阅读(10)  评论(0)    收藏  举报