带重启选项的C语言素数检测程序重复运行异常排查请求
问题排查与修复:素数检测程序重复运行后判定错误
我看到你的问题了——这个素数检测程序在两次重启后就会不管输入什么都判定为非素数,核心问题出在**count变量没有在每次循环开始时重置**,咱们来一步步拆解:
错误原因分析
你把count变量定义在main函数的最开头,这意味着它的生命周期是整个程序运行期间:
- 第一次运行时,如果输入非素数,
count会被设为1; - 当你选择重启(输入
J)后,程序进入下一轮do-while循环,但count的值仍然保持1,没有被重置为0; - 哪怕你后续输入的是素数,
for循环里不会修改count(因为素数无法被任何i整除),所以count始终是1,程序就会错误地判定它为非素数; - 第三次及以后的循环,
count一直保持1,自然所有输入都会被判定为非素数。
修复方案
有两种简单的修复方式,选一种即可:
方式1:将count的定义移到循环内部
把count的声明放到do-while循环里,这样每次循环都会重新初始化count为0:
#include <stdio.h> #include <ctype.h> int main(void) { int i=0, number; char answer; printf("\n\nthis programm check if a nummber is a prime nummber\n\n"); do { int count=0; // 每次循环都重新初始化count printf("input a positive nummber: "); scanf("%d", &number); // 额外补充:处理1及以下的输入(1不是素数) if(number <= 1) { printf("\n %d is not prime nummber.\n\n",number); // 跳过后续的素数检测逻辑 goto restart_prompt; } for (i=2; i<=number/2; i++) { if(number%i==0) { count=1; break; } } if (count==0) { printf("\n%d is prime nummber.\n\n",number); } else { printf("\n %d is not prime nummber.\n\n",number); } restart_prompt: do { printf("Do you want to restart the programm (J/N)? "); scanf(" %c", &answer); answer=toupper(answer); } while (answer!='J' && answer!='N'); } while (answer=='J'); return 0; }
方式2:每次循环开始时重置count
如果不想移动变量位置,在每次do-while循环的开头把count重置为0:
#include <stdio.h> #include <ctype.h> int main(void) { int i=0, number, count=0; char answer; printf("\n\nthis programm check if a nummber is a prime nummber\n\n"); do { count=0; // 每次循环开始时重置count为0 printf("input a positive nummber: "); scanf("%d", &number); // 额外补充:处理1及以下的输入 if(number <= 1) { printf("\n %d is not prime nummber.\n\n",number); goto restart_prompt; } for (i=2; i<=number/2; i++) { if(number%i==0) { count=1; break; } } if (count==0) { printf("\n%d is prime nummber.\n\n",number); } else { printf("\n %d is not prime nummber.\n\n",number); } restart_prompt: do { printf("Do you want to restart the programm (J/N)? "); scanf(" %c", &answer); answer=toupper(answer); } while (answer!='J' && answer!='N'); } while (answer=='J'); return 0; }
额外优化说明
我还补充了对number <= 1的判断——因为1不是素数,而原来的代码会错误地把1判定为素数,这个小优化能让程序更严谨。
内容的提问来源于stack exchange,提问作者Osama
相关产品推荐
相关产品推荐

