You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:32:33