Определение, является ли число кратным десяти или в пределах определенного набора диапазонов

У меня есть несколько циклов, которые мне нужны в моей программе. Я могу написать псевдокод, но я не совсем уверен, как написать их логически.

Я нуждаюсь —

if (num is a multiple of 10) { do this }

if (num is within 11-20, 31-40, 51-60, 71-80, 91-100) { do this }
else { do this } //this part is for 1-10, 21-30, 41-50, 61-70, 81-90

Это для настольной игры змей и лестниц, если это имеет смысл для моего вопроса.

Я полагаю, первое утверждение, если мне нужно будет использовать модуль, будет if (num == 100%10) быть правильным?

Второй я понятия не имею. Я могу написать это как if (num > 10 && num is < 21 || etc) но должно быть что-то умнее, чем это.

104

Решение

Для первого, чтобы проверить, является ли число многократным использованием:

if (num % 10 == 0) // its divisible by 10

Для второго:

if(((num - 1) / 10) % 2 == 1 && num <= 100)

Но это довольно плотно, вам может быть лучше просто перечислить опции явно.


Теперь, когда вы получили лучшее представление о том, что вы делаете, я бы написал вторую:

   int getRow(int num) {
return (num - 1) / 10;
}

if (getRow(num) % 2 == 0) {
}

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

86

Другие решения

if (num кратно 10) {сделать это}

if (num % 10 == 0) {
// Do something
}

если (число в пределах 11-20, 31-40, 51-60, 71-80, 91-100) {сделайте это}

Хитрость здесь в том, чтобы искать какую-то общность между диапазонами. Конечно, вы всегда можете использовать метод «грубой силы»:

if ((num > 10 && num <= 20) ||
(num > 30 && num <= 40) ||
(num > 50 && num <= 60) ||
(num > 70 && num <= 80) ||
(num > 90 && num <= 100)) {
// Do something
}

Но вы можете заметить это, если вычесть 1 от numу вас будут диапазоны:

10-19, 30-39, 50-59, 70-79, 90-99

Другими словами, все двузначные числа, первая цифра которых нечетная. Далее вам нужно придумать формулу, которая выражает это. Вы можете получить первую цифру, поделив ее на 10, и вы можете проверить, что она нечетная, проверив остаток от 1, когда вы делите на 2. Собрав все это вместе:

if ((num > 0) && (num <= 100) && (((num - 1) / 10) % 2 == 1)) {
// Do something
}

Учитывая компромисс между более длинным, но поддерживаемым кодом и более коротким «умным» кодом, я бы выбрал более длинный и понятный каждый раз. По крайней мере, если вы пытаетесь быть умным, пожалуйста, добавьте комментарий, который объясняет, что именно вы пытаетесь достичь.

Это помогает предположить, что следующий разработчик, работающий над кодом, вооружен и знает, где вы живете. 🙂

40

Если вы используете GCC или любой компилятор, который поддерживает Диапазоны случаев Вы можете сделать это, но ваш код будет не быть портативным

switch(num)
{
case 11 ... 20:
case 31 ... 40:
case 51 ... 60:
case 71 ... 80:
case 91 ... 100:
// do something
break;
default:
// do something else
break;
}
30

Это для будущих посетителей больше, чем для начинающих. Для более общего решения, подобного алгоритму, вы можете взять список начальных и конечных значений и проверить, находится ли переданное значение в одном из них:

template<typename It, typename Elem>
bool in_any_interval(It first, It last, const Elem &val) {
return std::any_of(first, last, [&val](const auto &p) {
return p.first <= val && val <= p.second;
});
}

Для простоты я использовал полиморфную лямбду (C ++ 14) вместо явного pair аргумент. Это должно также, вероятно, придерживаться использования < а также == чтобы соответствовать стандартным алгоритмам, но работает так до тех пор, пока Elem имеет <= определено для этого. В любом случае, его можно использовать так:

std::pair<int, int> intervals[]{
{11, 20}, {31, 40}, {51, 60}, {71, 80}, {91, 100}
};

const int num = 15;
std::cout << in_any_interval(std::begin(intervals), std::end(intervals), num);

Есть живой пример Вот.

15

Во-первых, это просто, вам просто нужно применить оператор по модулю к вашему значению num:

if ( ( num % 10 ) == 0)

SInce C ++ оценивает каждое число, которое не равно 0, как истинное, вы также можете написать:

if ( ! ( num % 10 ) )  //does not have a residue when devided by 10

Для второго я думаю, что это чище понять:

Шаблон повторяется каждые 20, так что вы можете рассчитать по модулю 20.
Все элементы, которые вы хотите, будут в строке, кроме тех, которые делятся на 20.

Чтобы получить их тоже, просто используйте num-1 или лучше num + 19, чтобы избежать отрицательных чисел.

if ( ( ( num + 19 ) % 20 ) > 9 )

Предполагается, что шаблон повторяется вечно, поэтому для 111-120 он будет применяться снова и так далее. В противном случае вам нужно ограничить число до 100:

if ( ( ( ( num + 19 ) % 20 ) > 9 ) && ( num <= 100 ) )
5

С парой хороших комментариев в коде, это может быть написано довольно кратко и читабельно.

// Check if it's a multiple of 10
if (num % 10 == 0) { ... }

// Check for whether tens digit is zero or even (1-10, 21-30, ...)
if ((num / 10) % 2 == 0) { ... }
else { ... }
5

Вы в основном объяснили ответ сами, но вот код на всякий случай.

if((x % 10) == 0) {
//do this
}
if((x > 10 && x < 21) || (x > 30 && x < 41) || (x > 50 && x < 61) || (x > 70 && x < 81) || (x > 90 && x < 101)) {
//do this
}
4

Вы могли бы переосмыслить это.

if (x % 10)
{
.. code for 1..9 ..
} else
{
.. code for 0, 10, 20 etc.
}

Первая строка if (x % 10) работает, потому что (а) значение, кратное 10, вычисляется как «0», другие числа приводят к их остатку, (б) значение 0 в if Считается falseлюбое другое значение true,

Редактировать:

Чтобы переключаться туда-сюда в двадцатых, используйте один и тот же прием. На этот раз основной номер 10:

if (((x-1)/10) & 1)
{
.. code for 10, 30, ..
} else
{
.. code for 20, 40, etc.
}

x/10 возвращает любое число от 0 до 9 как 0От 10 до 19 как 1 и так далее. Тестирование на четном или нечетном & 1 — говорит вам, если это четное или нечетное. Поскольку ваши диапазоны на самом деле «от 11 до 20», вычтите 1 перед тестированием.

3
По вопросам рекламы [email protected]