2012-03-23 3 views
3

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

+2

Вы имеете в виду 'a/2' и' a/2 + 1'? –

+1

Вы хотите, чтобы выражения выдавали правильный ответ, если 1. число четное (или оно никогда не понадобится?), И 2. если число отрицательно? – gbulmer

ответ

10

«меньшая половина» int x - x/2. «Большая половина» - x/2 + x%2 или x - x/2.

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

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

+3

'x - x/2' будет несколько проще для второй части, учитывая, что вы только что вычислили' x/2' ;-) –

+0

@DavidHeffernan: хорошая точка, добавила ее.Я считаю, что целочисленное деление на x86 всегда выдает модуль в регистре, поэтому интеллектуальный компилятор может оптимизировать 'x% 2' в доступе к регистру. –

+0

Вряд ли производительность будет актуальной, и вам все равно придется выполнять добавление, как в моей версии. –

2

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

int a = 9; 
int c = a/2; 
int b = a-c; 
+1

Но если a четный, результат не является тем, что требуется. –

+4

@ Richard Number нечетный в зависимости вопрос. –

+1

Спецификация указывает, что a нечетно. – mouviciel

0

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

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 является то, что если на входе отрицательный результат не будет ожидаемым.

+2

-1 Вы используете «пол» и «потолок» с вводом с плавающей запятой. Ваши входы - целые числа. –

+0

@DavidHeffernan хорошая точка, исправлено, теперь удалите свой голос! –

+1

Нет, если это лучший вопрос, который вы можете сделать. И нет, если вы настаиваете на использовании с плавающей запятой проблемы, которая должна выполняться чисто с целочисленной арифметикой. –

1

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

Это показывает альтернативный способ, с помощью сдвига >> и & которые иногда дешевле:

#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 является отрицательным.

0

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

var number = 11; 
var halfRoundedUp = (number % 2) ? number/2 + .5 : number/2; 
var halfRoundedDown = (number % 2) ? number/2 - .5 : number/2; 
alert(halfRoundedUp +" "+ halfRoundedDown);});