Самый простой способ рассчитать количество четных чисел в заданном диапазоне - PullRequest
13 голосов
/ 21 апреля 2010

Какой самый простой способ вычислить количество четных чисел в диапазоне целых чисел без знака?

Пример: если диапазон [0 ... 4], то ответ 3 (0,2,4)

Мне трудно придумать какой-нибудь простой способ. Единственное решение, которое я придумала, заключалось в использовании нескольких if-утверждений. Есть ли простая строка кода, которая может сделать это без операторов if или троичных операторов?

Ответы [ 16 ]

0 голосов
/ 21 апреля 2010

Ответ:

(max - min + 2 - (max % 2) - (min % 2)) / 2

Краткое объяснение:

  • четное ... даже урожайность (длина + 1) / 2
  • even..odd дает длину / 2
  • нечетно ... даже дает длину / 2
  • odd..odd выходов (длина - 1) / 2

  • длина = макс - мин + 1

Следовательно, ответом является (length - 1) / 2 плюс 1/2 для четных минут плюс 1/2 для четных макс. Обратите внимание, что (length - 1) / 2 == (max - min) / 2 и «бонусы» - это (1 - (min % 2)) / 2 и (1 - (max % 2)) / 2. Суммируйте все это и упростите, чтобы получить ответ выше.

0 голосов
/ 21 апреля 2010

Ну, почему бы и нет:

#include <cassert>

int ecount( int begin, int end ) {
    assert( begin <= end );
    int size = (end - begin) + 1;
    if ( size % 2 == 0  || begin % 2 == 1 ) {
        return size / 2;
    }
    else {
        return size / 2 + 1;
    }
}

int main() {
    assert( ecount( 1, 5 ) == 2 );
    assert( ecount( 1, 6 ) == 3 );
    assert( ecount( 2, 6 ) == 3 );
    assert( ecount( 1, 1 ) == 0 );
    assert( ecount( 2, 2 ) == 1 );
}
0 голосов
/ 21 апреля 2010

Давайте посмотрим на это логически ...

У нас есть четыре дела ...

odd -> odd     eg.  1 -> 3  answer: 1
odd -> even    eg.  1 -> 4  answer: 2
even -> odd    eg.  0 -> 3  answer: 2
even -> even   eg.  0 -> 4  answer: 3

Первые три случая могут быть обработаны просто как ...

(1 + last - first) / 2

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

answer = (1 + last - first) / 2;
if (both first and last are even)
    answer++;

Надеюсь, это поможет.

0 голосов
/ 21 апреля 2010

Первое четное число в диапазоне: (begin + 1) & ~1 (округлено begin до четного числа).

Последнее четное число в диапазоне: end & ~1 (округлено end до четного числа).

Таким образом, общее число четных чисел в диапазоне: (end & ~1) - ((begin + 1) & ~1) + 1.

int num_evens = (end & ~1) - ((begin + 1) & ~1) + 1;
0 голосов
/ 21 апреля 2010

Я бы сказал

(max - min + 1 + (min % 2)) / 2

Редактировать: Эм, хорошо, почему-то я подумал, что (min% 2) возвращает 1 для четных чисел .... :) Правильная версия

(max - min + 1 + 1 - (min % 2)) / 2

а точнее

(max - min + 2 - (min % 2)) / 2
0 голосов
/ 21 апреля 2010

Псевдокод (я не C-кодер):

count = 0;
foreach(i in range){
    if(i % 2 == 0){
      count++;
    }
}
...