如何划分奇数以留下两个整数?

时间:2012-03-23 15:38:58

标签: math

如果我有一个奇数,我怎么把它分成两个并留下两个整数,第一个比第二个多一个。例如9会产生5和4?

5 个答案:

答案 0 :(得分:15)

int x的“较小的一半”是x/2。 “较大的一半”是x/2 + x%2x - x/2

请注意,“较小”和“较大”是指绝对值,因此在负xbigger < smaller的情况下。

当然,如果x总是奇数和正数,那么x%2将为1,而较大的一半也可以计算为x/2 + 1

答案 1 :(得分:5)

这个怎么样?

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

答案 2 :(得分:3)

对于使用微控制器的人来说,/%可怕的成本操作: - )

这显示了一种替代方法,使用有时更便宜的转换>>&

#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 '/可能会返回正数或负数,但C99为负数。

答案 3 :(得分:2)

这是我推荐的方式:

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

我发现它比x/2 + x%2版本更简洁。 如果您碰巧使用偶数运行它,那么此版本也会受益于输出正确。

编辑:

人们似乎抱怨我使用浮点整数,这里是一个完全按位的版本:

int a = 9;

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

#2的唯一警告是,如果输入是否定的,结果将不是预期的结果。

答案 4 :(得分:1)

我认为接受的答案是在球场但不清楚。如果你想要一些复制和粘贴代码,这将是我眼中最好的解决方案

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