Как разделить нечетное число, чтобы оставить два целых числа? - PullRequest
7 голосов
/ 23 марта 2012

Если бы у меня было нечетное число, как бы я разделил его на два и оставил бы два целых числа, причем первое будет на одно больше второго. Например, 9 будет производить 5 и 4?

Ответы [ 5 ]

15 голосов
/ 23 марта 2012

"Меньшая половина" int x равна x/2. «Большая половина» составляет x/2 + x%2 или x - x/2.

Обратите внимание, что «меньше» и «больше» относятся к абсолютному значению, поэтому в случае отрицательного значения x, bigger < smaller.

Конечно, если x всегда нечетно и положительно, то x%2 будет 1, а большую половину можно также вычислить как x/2 + 1.

5 голосов
/ 23 марта 2012

Как насчет этого?

int a = 9;
int c = a/2;
int b = a-c;
3 голосов
/ 23 марта 2012

Для тех, кто использует микроконтроллеры, где / и % являются ужасной стоимостью операций: -)

Здесь показан альтернативный метод с использованием shift >> и& которые иногда дешевле:

#include <stdio.h>

int main (int argc, const char * argv[]) {
    const int iplus = 9;
    const int iminus = -9;

    printf("iplus=%d iminus=%d\n", iplus, iminus);

    printf("(iplus >> 1)=%d ((iplus >> 1) + (iplus & 1))=%d\n", iplus >> 1, (iplus >> 1) + (iplus & 1));
    printf("(iminus >> 1)=%d ((iminus >> 1) + (iminus & 1))=%d\n", iminus >> 1, (iminus >> 1) + (iminus & 1));

    return 0;
}

Вывод:

iplus=9 iminus=-9
(iplus >> 1)=4 ((iplus >> 1) + (iplus & 1))=5
(iminus >> 1)=-5 ((iminus >> 1) + (iminus & 1))=-4

В соответствии с этим Указывает ли ANSI C или ISO C, что должно быть -5% 10?

Существует различие в поведении для / между C89 и C99, и, в частности, C89 '/ с одним отрицательным числом может вернуть положительный или отрицательный результат, но C99 является отрицательным.

2 голосов
/ 23 марта 2012

Это мой рекомендуемый способ:

int low = floor(x / 2.0f);
int high = ceil(x / 2.0f);

Я считаю, что это более кратко, чем x/2 + x%2 версия. Эта версия также выигрывает от того факта, что вывод будет правильным, если вы запустите его, используя четное число.

EDIT:

Люди, похоже, жаловались на то, что я использую числа с плавающей запятой для целых чисел, ну вот полностью битовая версия:

int a = 9;

int b = a >> 1;
int c = b | (a & 0x1);

Единственное предостережение с # 2 заключается в том, что если входные данные отрицательные, результаты не будут такими, как ожидалось.

1 голос
/ 02 августа 2014

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

var number = 11;
var halfRoundedUp = (number % 2) ? number/2 + .5 : number/2;
var halfRoundedDown = (number % 2) ? number/2 - .5 : number/2;
alert(halfRoundedUp +" "+ halfRoundedDown);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...