2009-11-16 78 views
6

誰能告訴我如何編寫一個C程序來比較數字(包括負數)而不使用邏輯運算符?C程序比較整數而不使用邏輯運算符?

+4

你想得到什麼結果? – 2009-11-16 09:24:23

+1

我很確定這是一個dup,但找不到較舊的問題。考慮到另一個問題有一個明確的編碼解決方案,這可能是一件好事。 – outis 2009-11-16 09:44:49

+0

正如Sam152所提到的,您可以始終使用XOR(^中的^運算符)來表達文本。如果(a^b == 0) - >它們是相等的 – 2009-11-16 13:13:55

回答

4

這是一個比較兩個數字而不使用關係運算符 (它也適用於負數)的程序。一探究竟。

/------ C程序-------/

void main() 
{ 
    int a,b,c,temp; 
    printf("enter a and b:"); 
    scanf("%d%d",&a,&b); 
    c=a-b; 
    temp=c+abs(c);  // to check if the difference is negative or not 
    if(temp==0) 
    printf("a is smaller than b"); 
    else 
    printf("a is bigger than b"); 
    getch(); 
    } 

編輯:馬迪的修改後的代碼(從下他的評論)如下。

void main() { 
    int a,b,c,d,temp; 
    printf("enter a and b:"); 
    scanf("%d%d",&a,&b); 
    c=a-b; 
    d=abs(c); 
    temp=c+d; 
    if (c==0) printf("a is equal to b"); 
    else if(temp==0) printf("a is smaller than b"); 
    else printf("a is bigger than b"); 
    printf("%d",d); getch(); 
} 

我覺得現在的代碼非常適用於所有輸入...

+3

給作業問題提供一個完整的,即使不正確的解決方案也是不行的。因此,反對票。 – Paulius 2009-11-16 12:28:56

+0

上面的代碼運行良好。 我沒有得到這個代碼有什麼問題? – Madhan 2009-11-16 12:31:42

+1

@Paulius:事實上這是不正確的,但請注意,發佈此答案的是OP。 – Stephan202 2009-11-16 12:32:16

8

是的,你可以減去它們,看看不同之處。

我知道,這導致了下一個問題:如何判斷差異是否爲< 0,= 0或> 0?那麼,您可以通過檢查符號位是否已設置來處理< 0。

+0

這會導致一個問題:如何在沒有邏輯運算符的情況下檢查差異;) – Stephan202 2009-11-16 09:25:40

+1

先生可以顯示程序的狀態。 – Madhan 2009-11-16 09:26:03

+14

不,我不想做你的功課。 – 2009-11-16 09:27:56

1

假設你有int x和int y。設int z = x-y,然後重複(根據您的喜好選擇31或63次)取z | = z < < 1和z | = z >> 1。如果差值爲零,則z = 0,如果差值不爲零,則z = -1。向z添加一個,並用它來索引一個函數指針數組,其中包含您要在每種情況下遵循的指令。

如果您可以使用匯編,您可以更有效地做到這一點,但由於這聽起來不像是一個實際問題,我不認爲這些解決方案值得深入探索。如果你想要一個實用的解決方案,你只需要使用邏輯運算符:)

現在,問題陳述非常可疑,因爲計算機算法是用「邏輯運算符」定義的,但如果你天真地認爲(因爲他們可能想要你到)你輸入的是你使用的內容,上面的解決方案就足夠了。

編輯:你不要需要使用if/else語句。如果比較的符號很重要,請將符號帶入2s位置並使用該符號索引到函數指針數組中。

+0

最後一句是一個聰明的提示,+1。 – 2009-11-16 12:58:28

7

我們不打算做你的功課,但讓我補充一些關於如何進行的提示。我們假設我們要比較ab

  1. 作爲Carl states,你可能想看看差別了d = A - B
    • 觀察:d可以是負數,零或正數。
    • 問題:其中d的值對應於(在)的一個b平等?
  2. 一旦你計算d並知道如何解釋它,你必須找到方法來檢查它,而無需使用邏輯運算符。
    • 觀察:明顯的候選人是bitwise operators
    • 問題:但電腦(通常)如何存儲整數?
    • 提示:看看two's complement
    • 問題:你如何區分負數和非負數?
  3. 現在您擁有所有需要回答問題的信息。
    • 提示:你,當然,允許使用ifelse語句。
    • 加分提示:您可能需要使用limits.hINT_MIN

編輯:這個答案,和大多數其他答案在這裏假設OP是不允許使用logicalrelational比較)運營商。但是,OP僅明確提及邏輯運算符是不允許的。我認爲造成這種誤解的主要原因是,使用比較運算符解決這個問題是微不足道的。

3

可以使用關係運算符(<,>,< =,> =)和/或相等運算符(== ,!=)。

+0

+1:只有現在我注意到OP不排除這些。我想知道我們是否集體誤解了這個問題,或者說OP沒有正確地陳述他的任務。 (我傾向於去後者。) – Stephan202 2009-11-16 12:34:58

+0

看到我的第二個解決方案,靠近底部。我同意我們可能在一個幾乎微不足道的問題上做了一件大事。對我們感到羞恥!呃,你! – 2009-11-16 12:53:06

+0

我也選擇了後者,但仍想在這裏看到嚴格的文字答案。也許可以指出這種運動的毫無意義。 (現在,如果問題中提到「二進制補碼有符號整數」或「算術邏輯」而不是「C」,那應該是另一回事了。) – aib 2009-11-16 13:27:20

-1

這是一個比較兩個數字而不使用關係運算符(它也適用於負數)的程序。

void main() 
{ 
    int a,b,c,d,temp; 
    printf("enter a and b:"); 
    scanf("%d%d",&a,&b); 
    c=a-b; 
    d=abs(c); 
    temp=c+d; 
    if(c==0) 
     printf("a is equal to b"); 
    else if(temp==0) 
     printf("a is smaller than b"); 
    else 
     printf("a is bigger than b"); 
    printf("%d",d); 
    getch(); 
} 

我覺得現在的代碼非常適用於所有輸入...

+0

@Maddy:選擇你的代碼並按下'ctrl + k'來正確格式化它在這裏。此外,請妥善縮進它(就像我爲你做的那樣)。 – Stephan202 2009-11-16 12:54:44

+0

@Maddy,下一次,請更新/編輯您的上一個答案,而不是發佈一個新的答案。 – Stephan202 2009-11-16 12:55:31

+0

@stephan 好吧,先生,因爲我是新來的,我不知道這一點。從現在開始,我會遵循它。 謝謝你。 – Madhan 2009-11-16 13:00:12

1

請記住,邏輯運算符比算術運算符快得多。

至於你的答案...

if(x-y){ elements are different}else{ they are equals} 
+1

您確定這一說法嗎?在現代CPU中,大多數(所有?)整數運算在1個週期內完成,而邏輯通常意味着跳躍和跳躍通常意味着傾倒的管線。 – 2009-11-16 12:55:50

+0

實際上沒有:) JMP指令被CPU中的分支預測器檢測到,並且甚至在需要執行之前就被優先考慮。 8-32字節的算術運算速度更快,因爲MMX實際上比較慢(不太確定,但我想這很容易找到) 「傾倒的管道」發生在doiung調用時,不是本地(小)跳轉。 – Quamis 2009-11-18 08:49:59

24

這是卡爾的邪惡的雙胞胎,在這裏告訴你,你的所有弱小的弱者!

這裏有一點不只是沒有邏輯運算符也沒有關係運算符(包括==)和沒有if的解決方案。算術和索引,寶貝!

#include "stdio.h" 
#include "limits.h" 
int sign(int number) { 
    return (unsigned) number/(unsigned) INT_MIN; 
} 
int main(int argc, char *argv[]) { 
    int a = atoi(argv[1]); 
    int b = atoi(argv[2]); 
    int dif = a - b; 
    int sb1 = sign(dif); 
    int sb2 = sign(dif - 1) - sb1; 
    int ptr = 2 * sb2 + sb1; 
    char *messages[3] = { 
    "%d is greater than %d", 
    "%d is less than %d", 
    "%d is equal to %d" }; 
    printf(messages[ptr], a, b); 
} 

一些測試結果:

$ ./compare 42 69 
42 is less than 69 

$ ./compare 69 42 
69 is greater than 42 

$ ./compare 42 -15 
42 is greater than -15 

$ ./compare 999 999 
999 is equal to 999 

$ ./compare -9 -10 
-9 is greater than -10 

原來的問題,而另一方面,要容易得多。邏輯運算符只是!,&,&&,|,||!。我認爲嵌套if的幾個會輕鬆做到這一點。

+4

+1因爲我喜歡這個解決方案,因爲它不使用'if',這感覺就像是作弊。 – 2010-07-21 16:56:06

+0

因爲你在'sign(x)'的實現中隱藏了你的條件邏輯,所以我很想投票-1。你認爲'sign(x)'做什麼? AFAIK,沒有「邏輯運算符」(有條件)邏輯的內在實現。 – 2013-05-16 15:50:20

+0

@Mark Lakata:至少在我的程序中,我完全知道*什麼符號()所做的事情!如果你仔細閱讀我的代碼(第3-5行),你也會看到它。 – 2013-05-17 18:22:28

0

試試這個:

if(a-b) 
    printf("They are not equal"); 
else 
    printf("They are equal"); 
-1
int a = 2; 
int b = 1; 

int c = a - b; 

switch(c) 
{ 
    case 0: 
     System.out.println("equal"); 
    break; 

    default: 
     int min = Math.min(a, b); 

     switch(a - min) 
     { 
      case 0: 
       System.out.println("a lesser than b"); 
      break; 
      default: 
       System.out.println("a greater than b"); 
     } 
} 

隨着第一減法如果這兩個數字是平等的檢查,因爲a-b=0只有ab是相同的。 因此,只有在ab不同時,我們才處於第一個開關的默認情況。
現在從ab服用min(這裏是訣竅,有一個隱含的,如果與Math.min函數內部邏輯運算符),我們可以用這個min減去a。如果結果爲0那意味着a小於b
最後一種情況是剩下的一種,所以a大於b。 使用if子句(0false,其他→true)接受整數的語言可以使用if而不是switch(不適用於java)。

+0

你可能應該解釋你的代碼。 – md5 2012-10-20 16:25:51

+0

完成:)是否清楚? – 2012-10-31 09:10:19

+0

是C#嗎? C沒有'System.out.println'或'Math.min'。 – 2013-05-13 15:50:15

-1

好的。 a-b是顯而易見的,但是接着檢查a<ba>b是否讓我難倒了一段時間,如果你不使用位掩碼......好的,一旦回到這樣的事情,保持經驗不讓你去尋找替代品解決方案。 ;)下面是我想到的:

// -1 means a<b; 0 means a=b; 1 means a>b 
char cmp(double a, double b) 
{ 
    // (diff-1)/diff gives 1 or 2 if diff < 0 (e.g. -2/-1) = then a<b; 0 otherwise = a>b : 
    return (a = a - b) 
     ? (int)((a - 1)/a) ? -1 : 1 
     : 0; 
} 
+0

多處未定義的行爲和其他問題。 – Olaf 2018-03-09 18:19:47

0

如果你不介意低效的while循環,以下工作相當好,而且易於閱讀。 XOR輸入,然後移動答案,直到結果爲1或0(不匹配或匹配)。

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    int first_number = atoi(argv[1]); 
    int second_number = atoi(argv[2]); 

    unsigned int not_equal = (first_number^second_number); 

    while (not_equal & ~0x01) 
     not_equal >>= 1; 

    char *response[2] = { "Numbers Match!\n", 
          "Numbers don't match...\n"}; 

    printf(response[not_equal]); 

    return 0; 
}