整数入力が必要だが、その中に数字2または3が含まれている場合、拒否されます。特定の数字が望ましくない場合に整数を拒否する方法
たとえば、23564と入力すると無効になります。
私はこれを解決するためにdo-whileループを使用することを考えていましたが、個々の数字を読み取るにはどうすればよいですか。
整数入力が必要だが、その中に数字2または3が含まれている場合、拒否されます。特定の数字が望ましくない場合に整数を拒否する方法
たとえば、23564と入力すると無効になります。
私はこれを解決するためにdo-whileループを使用することを考えていましたが、個々の数字を読み取るにはどうすればよいですか。
次のようなもので数の最後の数字を得ることができます、はい、つまり
number = number/10; // gives 2345
:あなたがして、すべての桁が右に「シフト」をさらにすることができます
unsigned int number = 23456;
unsigned int digit = number % 10; // gives 6
あなたが提案した方法を使用してそれを行うことができます:
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);
}
はこちらをご覧:
#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;
}
パフォーマンスについてあまり気にしない場合は、整数を文字列に変換して数字を探すことができます。これは最後の桁を抽出して比較するよりも遅いです。
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 && found3 == std::string::npos;
入力を直接整数型に読み替える代わりに、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);
}
to_stringには、(モジュロものよりも)容易溶液 – deviantfan
使用分割余り( '%')であるか、または数値を文字列に変換します。 – krzaq
@krzaq - +1は**モジュラスの任意の変種として '%'を参照していません**。 –