采访qns ...在没有任何条件或比较运算符的情况下执行以下操作

nbo*_*jja 4 algorithm math

不使用任何条件或比较运算符执行以下操作.

if (Number <= 0)
{
    Print '0';
}
else
{
    print Number;
}
Run Code Online (Sandbox Code Playgroud)

谢谢..

Roe*_*ler 13

我最初的简单解决方案

1. print( (abs(Number)+Number) / 2 )
Run Code Online (Sandbox Code Playgroud)

该解决方案在大多数情况下都有效,除非Number非常大(超过最大值的一半,例如Number> = MAX_INT/2),在这种情况下,加法可能会导致溢出.

以下解决方案解决了溢出问题:

2. print( (abs(Number)/2) + (Number/2) )
Run Code Online (Sandbox Code Playgroud)

但是,可能存在Number是且必须保持整数的情况,并且除法运算符(/)是整数除法,因此7/2 = 3.在这种情况下,解决方案2将无法工作,因为如果Number = 7,它将打印6(对于这种情况,解决方案1将正常工作).

因此,如果我们需要处理大数和整数运算,下面的怪物就会出现挽救,在奇数整数的情况下,在除法中可能会丢失1的补偿:

3. print( 
    ( (abs(Number)/2)+(Number/2) ) +
    ((
        (Number-(2*(Number/2))) + 
        (abs(Number)-(2*(abs(Number)/2)))
    ) / 2)
    )        
Run Code Online (Sandbox Code Playgroud)


sou*_*rge 9

print max(0, number)
Run Code Online (Sandbox Code Playgroud)

  • 如果它是比较而不是内置函数,则sign()和abs()也是如此. (3认同)

Cyb*_*ons 9

假设该数字由8位二进制补码整数表示.

包括0的正数都将MSB设置为0.

负数都将MSB设置为1.

因此,我们采用MSB的补码,将其扩展为完整的8位,并将其与原始数字进行按位AND,例如

正:

00110101 - > MSB为0

11111111 - > MSB的补充扩展

00110101 - >按位AND以上

负:

10110101 - > MSB是1

00000000 - >补充MSB扩展

00000000 - >按位AND以上

不需要比较 - 我有点假设按位AND并不是严格的比较.

此外,抱歉缺乏代码,但你明白了.