C++实现素数逗号分隔输出:如何去除末尾多余逗号?
解决C++素数输出末尾多余逗号的问题
你的代码已经能正确输出n以内的素数,但每个素数后都直接追加逗号,导致最后一个素数后面多了个不必要的逗号。这里提供几种简单的修复方案,顺便优化下素数判断的效率:
方案一:用标志位控制逗号输出
核心思路是:第一个素数直接输出,后续的素数先输出逗号再输出数字,避免末尾出现逗号。同时优化素数判断逻辑,提升效率:
#include <iostream> using namespace std; // 优化后的素数判断函数,返回bool值更直观 bool isPrime(int num) { if (num < 2) return false; // 只需遍历到sqrt(num),减少循环次数 for(int i = 2; i * i <= num; i++) { if(num % i == 0) return false; } return true; } int main(int argc, const char * argv[]) { int n; cin >> n; bool isFirst = true; // 标记是否是第一个素数 for(int i = 2; i <= n; i++) { if(isPrime(i)) { if(!isFirst) { // 非第一个素数,先输出逗号分隔符 cout << ", "; } cout << i; isFirst = false; // 输出第一个素数后,标记改为false } } cout << endl; return 0; }
方案二:先收集所有素数再统一输出
先把找到的素数存到容器里,再遍历容器输出,只对非最后一个素数添加逗号:
#include <iostream> #include <vector> using namespace std; bool isPrime(int num) { if (num < 2) return false; for(int i = 2; i * i <= num; i++) { if(num % i == 0) return false; } return true; } int main(int argc, const char * argv[]) { int n; cin >> n; vector<int> primes; // 先收集所有素数 for(int i = 2; i <= n; i++) { if(isPrime(i)) { primes.push_back(i); } } // 遍历输出,控制逗号 for(size_t i = 0; i < primes.size(); i++) { cout << primes[i]; if(i != primes.size() - 1) { cout << ", "; } } cout << endl; return 0; }
补充说明
原代码里的check函数有两个可以优化的点:
- 参数
ra完全没用到,可以直接删除; - 素数判断时循环从1到
a效率太低,实际上只要判断到sqrt(a)就足够,因为如果a有大于sqrt(a)的因数,对应的另一个因数必然小于sqrt(a)。
内容的提问来源于stack exchange,提问作者Komil Rajabov
相关产品推荐
相关产品推荐

