如何在C++输入逻辑中限制用户输入唯一的0-8数值?
嘿,这个问题我太懂了!逐个写if(index[1]==index[2]||...)这种判断不仅代码冗长到爆炸,而且稍微改一下输入数量就会彻底失控,完全不推荐。下面给你两种优雅又高效的解决方案,完美替代这种繁琐的写法:
解决重复输入的两种高效方法
方法1:利用布尔数组标记已输入值(最适合固定范围的场景)
因为你的输入范围是0到8,刚好可以用一个大小为9的布尔数组来标记每个数字是否已经被输入过。这个方法的检查效率是O(1),非常高效,而且代码逻辑清晰。
修改后的完整代码示例:
#include <iostream> using namespace std; int main() { int index[9]; bool used[9] = {false}; // 初始化所有元素为false,标记数字是否已被使用 int validCount = 0; // 记录已成功输入的唯一数字数量 cout << "Enter numbers from 0 to 8 in any order (no duplicates allowed):" << endl; // 用while循环替代原for循环,确保只有输入有效数字时才计数 while (validCount < 9) { cout << "Input " << validCount << ": "; int num; cin >> num; // 先验证输入是否在合法范围内 if (num < 0 || num > 8) { cout << "Oops! Please enter a number between 0 and 8." << endl; continue; } // 检查当前数字是否已经被输入过 if (used[num]) { cout << "This number was already entered! Try another one." << endl; } else { // 标记为已使用,存入数组,有效计数加1 used[num] = true; index[validCount] = num; validCount++; } } // 可选:输出验证结果 cout << "\nAll unique numbers entered successfully: "; for (int i = 0; i < 9; i++) { cout << index[i] << " "; } cout << endl; return 0; }
方法2:使用STL集合容器(更灵活通用)
如果以后你的输入范围可能变化(比如从0-8改成0-100),用STL的unordered_set或者set会更方便——集合本身就自带去重特性,不需要手动维护标记数组。
示例代码:
#include <iostream> #include <unordered_set> using namespace std; int main() { int index[9]; unordered_set<int> enteredNums; // 存储已输入的数字 int validCount = 0; cout << "Enter numbers from 0 to 8 in any order (no duplicates allowed):" << endl; while (validCount < 9) { cout << "Input " << validCount << ": "; int num; cin >> num; if (num < 0 || num > 8) { cout << "Invalid input! Stick to numbers 0-8 please." << endl; continue; } // 检查集合中是否已有该数字 if (enteredNums.find(num) != enteredNums.end()) { cout << "Duplicate alert! This number's already been entered." << endl; } else { enteredNums.insert(num); index[validCount] = num; validCount++; } } cout << "\nSuccess! Your unique numbers: "; for (int num : index) { cout << num << " "; } cout << endl; return 0; }
为什么这两种方法比逐个判断好?
- 代码可维护性:不管输入数量是9还是99,代码结构都不需要大改;
- 效率更高:两种方法的检查操作平均时间复杂度都是O(1),而逐个判断是O(n²),输入越多差距越明显;
- 逻辑更清晰:一眼就能看懂是在做重复检查,不像一堆
||的判断那样让人头大。
内容的提问来源于stack exchange,提问作者Moofi
相关产品推荐
相关产品推荐

