#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);
}