C语言质数打印程序优化:无需if语句判定1非质数的方法
无需if语句判定1不是质数的C语言实现方案
你刚接触C语言,写了一段根据输入范围打印质数的代码,觉得check函数里判断number == 1的if语句像“补丁”,想要不用if的替代方案,下面提供两种简洁的实现方式:
原代码回顾
#include <stdio.h> int check(int number) { if (number == 1) { return 0; } int count = 2; while (count < number) { if (number%count == 0) { return 0; } count++; } return 1; } void main() { int i,min,max; printf("Enter start of range: "); scanf("%d",&min); printf("Enter end of range: "); scanf("%d",&max); for (i = min;i < max;i++) { if (check(i) == 1) { printf("%d\n",i); } } }
方案一:利用逻辑短路与表达式返回值
修改后的check函数完全去掉了开头的if语句:
int check(int number) { int count = 2; // 逻辑短路特性:number<=1时,&&右侧不会执行,循环直接跳过 while (number > 1 && count < number) { if (number % count == 0) { return 0; } count++; } // 直接返回number>1的结果:number>1时返回1,否则返回0 return number > 1; }
原理说明
- C语言中关系表达式的结果是整数:
number > 1在number大于1时返回1,否则返回0,刚好匹配质数判定的结果。 - while循环的
number > 1 && count < number利用逻辑短路:当number <=1时,&&左侧为0,右侧的count < number不会执行,循环直接跳过,最后返回number >1的0,自动判定1不是质数。
方案二:调整循环起始条件与边界
另一种思路是让循环的起始条件自动过滤掉1的情况:
int check(int number) { // 当number<=1时,count初始值等于number,循环条件不成立 int count = number > 1 ? 2 : number; while (count < number) { if (number % count == 0) { return 0; } count++; } return number > 1; }
原理说明
- 用三元运算符(
?:)给count赋值:number大于1时count设为2,否则count等于number,此时count < number不成立,循环直接不执行。 - 最后同样返回
number >1的表达式结果,无需额外if判断。
这两种方案都没有使用if语句单独判定1的情况,同时保持了质数判定的正确性,避免了“补丁代码”的感觉。
内容的提问来源于stack exchange,提问作者nkminion
相关产品推荐
相关产品推荐

