C语言打印素数时如何实现逗号分隔且末尾无多余逗号
素数打印去除末尾多余逗号实现方案
方案1:首元素标记法(推荐,无需提前遍历统计)
这是处理序列分隔符最常用的方案,只需要新增一个标记变量判断是否为第一个输出的素数即可:
#include<stdio.h> int main() { int x, y, i, j; int first_flag = 1; // 标记是否是第一个素数 puts("Enter first number: "); scanf("%d", &x); puts("Enter second number: "); scanf("%d", &y); for(i = x; i <= y; i++) { // 补充1不是素数的判断 if(i < 2) continue; for(j = 2; j <= i/2; j++) // 也可以优化到sqrt(i),进一步降低循环次数 { if(i % j == 0) { break; } } if(i == j) { if(first_flag) { printf("%d", i); first_flag = 0; } else { printf(", %d", i); } } } // 可选:输出结束后加换行 printf("\n"); return 0; }
方案2:素数预统计法(你提到的思路完全可行)
先遍历一次区间统计素数总数量,第二次遍历输出时通过计数判断是否为最后一个素数,再决定是否输出逗号:
#include<stdio.h> int main() { int x, y, i, j; int prime_count = 0; int current_count = 0; puts("Enter first number: "); scanf("%d", &x); puts("Enter second number: "); scanf("%d", &y); // 第一次遍历统计素数总数 for(i = x; i <= y; i++) { if(i < 2) continue; for(j = 2; j <= i/2; j++) { if(i % j == 0) break; } if(i == j) prime_count++; } // 第二次遍历输出 for(i = x; i <= y; i++) { if(i < 2) continue; for(j = 2; j <= i/2; j++) { if(i % j == 0) break; } if(i == j) { current_count++; if(current_count == prime_count) { printf("%d", i); } else { printf("%d, ", i); } } } printf("\n"); return 0; }
原代码优化点说明
- 标准C规范中
main函数返回值应为int,执行结束后补充return 0;符合标准要求 - 补充了i<2的判断,避免将1误判为素数
- 内层素数判断循环上限优化到i/2或者sqrt(i),可以大幅减少不必要的循环运算,提升程序执行效率
内容的提问来源于stack exchange,提问作者Dexter1403
相关产品推荐
相关产品推荐

