C++统计质数代码输入合数后后续质数无法正确计数问题求解
问题排查结果
错误原因
- 质数标记变量
j未每次重置:j定义在do-while循环外部,仅在程序启动时初始化为0。当第一次输入合数(示例中的4)时j被赋值为1,后续循环没有重置逻辑,j始终保持为1,导致后续所有质数都无法触发j==0的计数条件。 - 0/1判断存在语法错误:
num == 0 || num == 1分支中的j == 1是比较运算,没有赋值效果,输入0或1时无法正确标记为非质数。 - 隐式依赖缺失:代码使用了
INT_MIN、INT_MAX但未引入<climits>头,使用string未引入<string>头,部分编译器会编译失败。 - 缓冲区清理逻辑错误:
cin.ignore(sum, '\n')的第一个参数应为要忽略的最大字符数,传入累计和sum完全不符合需求,可能导致输入缓冲区残留异常。
修复方案
修改点
- 每次进入数字判断逻辑前,先将
j重置为0 - 将0/1分支的
j == 1改为赋值语句j = 1 - 补全缺失的头文件引入
- 修正
cin.ignore的参数为标准的全缓冲区忽略写法
修复后完整代码
#include <iostream> #include <string> #include <climits> #include <limits> using namespace std; int main() { int num; string var; int sum=0; int i; int largest = INT_MIN; int smallest = INT_MAX; int prime = 0; do { cout << "Please enter a series of numbers, press (Q or q) to process: "; cin >> num; // 每次处理新数字前重置质数标记 int j = 0; if (cin.fail()) { cin.clear(); cin >> var; if (var != "Q" && var != "q") { cout << "Invalid input, try again" << endl; } else { break; } } if (num > largest) { largest = num; } if (num < smallest) { smallest = num; } if (num == 0 || num == 1) { j = 1; } else { for (i = 2; i <= num / 2; i++) { if (num % i == 0) { j = 1; break; } } if (j == 0) { prime++; } } sum += num; cout << "The corresponding element for the cumulative total sequence is: " << sum << endl; // 修正缓冲区清理逻辑 cin.ignore(numeric_limits<streamsize>::max(), '\n'); } while (var != "Q" && var != "q"); cout << endl; cout << "Largest number: " << largest << endl; cout << "Smallest number: " << smallest << endl; cout << "How many prime numbers? " << prime << endl; cout << "Have a great day!" << endl; return 0; }
验证结果
输入示例的2、7、4、13、17后,质数计数输出为4,符合预期。
内容的提问来源于stack exchange,提问作者Abal230
相关产品推荐
相关产品推荐

