簡體   English   中英

不使用條件語句檢測 -1

[英]Detect -1 without using a conditional statement

你好,我在學校被問過這個問題。 我似乎無法弄清楚。

不使用任何條件語句(if/else/switch:case/while/for 等)編寫 ac 程序,輸出:
1535(整數)如果輸入是 -1(整數)
否則它輸出輸入(如果不是-1)?

問題是評估我的邏輯技能而不是 C 編程技能。

考慮:

(問題是評估我的邏輯技能而不是 C 編程技能)

我認為像“三元運算符不是條件陳述”這樣的語言律師違背了問題的精神。 因此,讓我們從完全無分支的角度來解決這個問題。

對我來說,這直觀地感覺像是乘法的工作,因為操作的“0 吞噬一切”和“1 導致無操作”屬性將允許我們同時管理不同的“路徑”。

換句話說,如果我們有一個魔法函數f() ,其中f(0) == 1f(anything else) == 0 ,那么我們可以利用x * 0 == 0x * 1 == x來“組合”兩個可能的答案:

int answer(int v) {
  int f_result = f(v + 1); // Offset the -1 to 0, which becomes 1, anything else becomes 0
  int f_inv = f(f_result); // 1 becomes 0, 0 becomes 1

  return 
     v * f_inv + 
     1535 * f_result;
}

所以,我們現在需要的只是一個f() ,它為 0 返回 1,為其他任何返回 0。

簡直就是! 一元運算符: int f(int v) { return !v; } int f(int v) { return !v; }

我可以建議以下方法

#include <stdio.h>

int main(void) 
{
    const int DEFAULT_VALUE = 1535;
    
    printf( "Enter any number or -1: " );
    
    int n = -1;
    
    scanf( "%d", &n );
    
    printf( "%d\n", ( n == -1 ) * DEFAULT_VALUE + ( n != -1 ) * n );
    
    return 0;
}

程序輸出可能看起來像

Enter any number or -1: -1
1535

或者例如

Enter any number or -1: 10
10

程序的關鍵語句如下

printf( "%d\n", ( n == -1 ) * DEFAULT_VALUE + ( n != -1 ) * n );

救援中的邏輯運算符!

int f(int v)
{
    /*We can detect v=-1 just adding one. Next we compare it with -1 */
    /*boolean contains "1" or "0" */
    bool val= !(-1 && (v+1)); /*=1 for v=-1 */

    /*Finally we operate for both results of val */
    int res =  ((int) val) * 1535 + (int)(!val)*v;

    return res;   
 }
  1. 按位非將 (111...1) 轉換為 (000...0) 為 -1(並且其他任何內容都將非零)
  2. 邏輯非將 (000....0) 轉換為 1(以及其他任何轉換為​​ 0)
  3. 乘以 1535

這是一個測試所有整數的完整 C 程序:

#include <stdio.h>
#include <limits.h>

int result(int value)
{
    return (!(~value))*1535;
}

void check(int input, int expected)
{
    if (result(input) != expected)
        printf("Result was %d for input %d (expected: %d)\n", result(input), input, expected);
}

int main()
{
    for (int i = INT_MIN; i > -1; ++i)
        check(i, 0);
    for (int i = 0; i < INT_MAX; ++i)
        check(i, 0);

    check(INT_MAX, 0);
    check(-1, 1535);
}

現場演示


獎金 C++ 演示(因為問題最初是這樣標記的):

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM