Если у меня есть нечетное число, как бы я разделил его на две части и оставил два целых числа, причем первое было бы вторым, чем второе. Например, 9 будет производить 5 и 4?Как разделить нечетное число, чтобы оставить два целых числа?
ответ
«меньшая половина» int x
- x/2
. «Большая половина» - x/2 + x%2
или x - x/2
.
Обратите внимание, что «меньше» и «больше» относятся к абсолютному значению, поэтому в случае отрицательных x
, bigger < smaller
.
Конечно, если x
всегда нечетно и положительна, то x%2
будет 1
и больше половины также может быть вычислена как x/2 + 1
.
'x - x/2' будет несколько проще для второй части, учитывая, что вы только что вычислили' x/2' ;-) –
@DavidHeffernan: хорошая точка, добавила ее.Я считаю, что целочисленное деление на x86 всегда выдает модуль в регистре, поэтому интеллектуальный компилятор может оптимизировать 'x% 2' в доступе к регистру. –
Вряд ли производительность будет актуальной, и вам все равно придется выполнять добавление, как в моей версии. –
Как насчет этого?
int a = 9;
int c = a/2;
int b = a-c;
Но если a четный, результат не является тем, что требуется. –
@ Richard Number нечетный в зависимости вопрос. –
Спецификация указывает, что a нечетно. – mouviciel
Это будет мой Рекомендуемый способ:
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 Вы используете «пол» и «потолок» с вводом с плавающей запятой. Ваши входы - целые числа. –
@DavidHeffernan хорошая точка, исправлено, теперь удалите свой голос! –
Нет, если это лучший вопрос, который вы можете сделать. И нет, если вы настаиваете на использовании с плавающей запятой проблемы, которая должна выполняться чисто с целочисленной арифметикой. –
Для людей, которые используют микроконтроллеры, где /
и %
являются грозных издержек операции :-)
Это показывает альтернативный способ, с помощью сдвига >>
и &
которые иногда дешевле:
#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
Согласно этому Does either ANSI C or ISO C specify what -5 % 10 should be?
Существует разница поведения для /
между C89 и C99, C89 и конкретно '/
с одним отрицательным числом может вернуть положительный или отрицательный результат, но С99 является отрицательным.
Я думал, что принятый ответ был на футбольном поле, но неясно. Если вам нужен код для копирования и вставки, это было бы лучшим решением в моих глазах.
var number = 11;
var halfRoundedUp = (number % 2) ? number/2 + .5 : number/2;
var halfRoundedDown = (number % 2) ? number/2 - .5 : number/2;
alert(halfRoundedUp +" "+ halfRoundedDown);});
Вы имеете в виду 'a/2' и' a/2 + 1'? –
Вы хотите, чтобы выражения выдавали правильный ответ, если 1. число четное (или оно никогда не понадобится?), И 2. если число отрицательно? – gbulmer