Вы можете получить значение наименьшего (наименее значимого) ди git десятичного числа, взяв остаток после деления его на 10; в C++
это легко выполнить с помощью оператора по модулю (%
). Таким образом, с учетом переменной integer , a
, со значением 123
, оператор int b = a % 10;
назначит 3
b
.
Теперь, запустив al oop, в котором мы последовательно делим «тестовое» число на 10 (пока оно не достигнет нуля), мы можем получить значения для каждого di git. Если мы сохраняем массив значений bool
, устанавливая каждое из них на true
, когда мы находим заданную ди git, мы можем быстро обнаружить повторную ди git.
Таким образом, эта функция будет выполните работу:
bool HasRepeatDigit(int x)
{
bool hasDigit[10] = {false, false, false, false, false, false, false, false, false, false};
while (x > 0) {
int digit = x % 10;
if (hasDigit[digit]) return true; // We already have this digit!
hasDigit[digit] = true; // Flag the digit we just found
x /= 10; // Divide by 10, to move onto the next digit
}
return false; // If we get here, there is no repeat digit!
}
Затем вы можете вызвать эту функцию для каждого из ваших «тестовых» номеров за секунду l oop, добавив те числа, которые имеют повторяющиеся цифры, к новому вектору:
vector<int> withRepeats;
for (auto i : listofnums) { // Tests "i" for every element in listofnums
if (HasRepeatDigit(i)) withRepeats.push_back(i); // Append this to the new vector
}
Не стесняйтесь обращаться за дополнительными объяснениями и / или разъяснениями.
Кроме того, вы можете уменьшить код, который заполняет ваш listofnums
вектор, используя std::iota
функция (определена в заголовке <numeric>
):
#include <numeric>
//...
std::iota(begin(listofnums), end(listofnums), a);