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(n2)
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 )。
浙公网安备 33010602011771号