Как отклонить целое число, если определенные цифры не нужны

#c

#c

Вопрос:

Если я хочу ввести целое число, но если оно содержит какие-либо цифры 2 или 3, оно будет отклонено.

Например, ввод 23564 будет недействительным.

Я думал об использовании циклов do-while для решения этой проблемы, но как мне заставить его считывать отдельные цифры.

Комментарии:

1. to_string — более простое решение (чем по модулю)

2. Используйте функцию division remaint ( % ) или преобразуйте число в строку.

3. @krzaq — 1 за то, что не ссылается на % какой-либо вариант «модуля».

4. Или используйте двоичный код. Гарантированно не иметь 2 и 3;)

Ответ №1:

Посмотрите здесь:

 #include <iostream>
using namespace std;
int main() {
    int n,num,flag;
    do{
    cout<<"Enter number";
    cin>>n;
    num = n;
    flag = 0;
    while(num>0)
    {
        if(num%10 == 2 || num%10 ==3)
        {
            flag = 1;
            break;
        }
        num = num/10;
    }
    }while(flag==1);
    return 0;
}
 

Ответ №2:

Если вы не очень заботитесь о производительности, вы можете преобразовать целое число в строку и искать цифры. Это медленнее, чем извлечение последней цифры и ее сравнение.

 std::string str = std::to_string(number);
auto found2 = str.find('2');
auto found3 = str.find('3');

//number is valid if it doesn't have a 2 or a 3
bool isValid = found2 == std::string::npos amp;amp; found3 == std::string::npos;
 

Ответ №3:

Вы можете получить последнюю цифру числа с помощью чего-то вроде:

 unsigned int number = 23456;
unsigned int digit = number % 10;  // gives 6
 

Вы можете дополнительно «сдвинуть» все цифры прямо с:

 number = number / 10;              // gives 2345
 

Другими словами, да, вы можете сделать это, используя предлагаемый вами метод:

 bool has2Or3(unsigned int number) {
    // Do until no more digits left.

    while (number != 0) {
        // Get last digit, return true if 2 or 3.

        int digit = number % 10;
        if ((digit == 2) || (digit == 3)) {
            return true;
        }

        // Prepare to get next digit.

        number = number / 10;
    }

    // If NO digits were 2 or 3, return false.

    return false;
}
 

Другим способом было бы просто преобразовать его в строку и использовать строковые функции, чтобы увидеть, содержит ли оно определенную цифру, что-то вроде:

 bool has2Or3(unsigned int number) {
    // Get number as string (via string stream).

    std::stringstream ss;
    ss << number;
    std::string s = ss.str();

    // If contains 2, return true, else continue.

    if (s.find("2") != std::string::npos)
        return true;

    // If contains 3, return true, else return false.

    return (s.find("3") != std::string::npos);
}
 

Ответ №4:

Вместо того, чтобы считывать входные данные непосредственно в целочисленный тип, считайте его в a std::string . Затем просто проверить наличие нежелательных цифр; если строка проходит проверку, преобразуйте ее в целое число:

 int get_value() {
    std::string bad = "23";
    std::string input = "2"; // start with bad input
    while (std::find_first_of(input.begin(), input.end(),
        bad.begin(), bad.end()) != input.end()) {
        std::cout << "Gimme a number: ";
        std::cin >> input;
    }
    return std::stoi(input);
}