誰能告訴我如何編寫一個C程序來比較數字(包括負數)而不使用邏輯運算符?C程序比較整數而不使用邏輯運算符?
回答
這是一個比較兩個數字而不使用關係運算符 (它也適用於負數)的程序。一探究竟。
/------ 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();
}
我覺得現在的代碼非常適用於所有輸入...
給作業問題提供一個完整的,即使不正確的解決方案也是不行的。因此,反對票。 – Paulius 2009-11-16 12:28:56
上面的代碼運行良好。 我沒有得到這個代碼有什麼問題? – Madhan 2009-11-16 12:31:42
@Paulius:事實上這是不正確的,但請注意,發佈此答案的是OP。 – Stephan202 2009-11-16 12:32:16
是的,你可以減去它們,看看不同之處。
我知道,這導致了下一個問題:如何判斷差異是否爲< 0,= 0或> 0?那麼,您可以通過檢查符號位是否已設置來處理< 0。
這會導致一個問題:如何在沒有邏輯運算符的情況下檢查差異;) – Stephan202 2009-11-16 09:25:40
先生可以顯示程序的狀態。 – Madhan 2009-11-16 09:26:03
不,我不想做你的功課。 – 2009-11-16 09:27:56
假設你有int x和int y。設int z = x-y,然後重複(根據您的喜好選擇31或63次)取z | = z < < 1和z | = z >> 1。如果差值爲零,則z = 0,如果差值不爲零,則z = -1。向z添加一個,並用它來索引一個函數指針數組,其中包含您要在每種情況下遵循的指令。
如果您可以使用匯編,您可以更有效地做到這一點,但由於這聽起來不像是一個實際問題,我不認爲這些解決方案值得深入探索。如果你想要一個實用的解決方案,你只需要使用邏輯運算符:)
現在,問題陳述非常可疑,因爲計算機算法是用「邏輯運算符」定義的,但如果你天真地認爲(因爲他們可能想要你到)你輸入的是你使用的內容,上面的解決方案就足夠了。
編輯:你不要需要使用if/else語句。如果比較的符號很重要,請將符號帶入2s位置並使用該符號索引到函數指針數組中。
最後一句是一個聰明的提示,+1。 – 2009-11-16 12:58:28
我們不打算做你的功課,但讓我補充一些關於如何進行的提示。我們假設我們要比較a和b。
- 作爲Carl states,你可能想看看差別了d = A - B。
- 觀察:d可以是負數,零或正數。
- 問題:其中d的值對應於(在)的一個和b平等?
- 一旦你計算d並知道如何解釋它,你必須找到方法來檢查它,而無需使用邏輯運算符。
- 觀察:明顯的候選人是bitwise operators。
- 問題:但電腦(通常)如何存儲整數?
- 提示:看看two's complement。
- 問題:你如何區分負數和非負數?
- 現在您擁有所有需要回答問題的信息。
- 提示:你是,當然,允許使用
if
和else
語句。 - 加分提示:您可能需要使用
limits.h
的INT_MIN
。
- 提示:你是,當然,允許使用
編輯:這個答案,和大多數其他答案在這裏假設OP是不允許使用logical和relational(比較)運營商。但是,OP僅明確提及邏輯運算符是不允許的。我認爲造成這種誤解的主要原因是,使用比較運算符解決這個問題是微不足道的。
可以使用關係運算符(<,>,< =,> =)和/或相等運算符(== ,!=)。
+1:只有現在我注意到OP不排除這些。我想知道我們是否集體誤解了這個問題,或者說OP沒有正確地陳述他的任務。 (我傾向於去後者。) – Stephan202 2009-11-16 12:34:58
看到我的第二個解決方案,靠近底部。我同意我們可能在一個幾乎微不足道的問題上做了一件大事。對我們感到羞恥!呃,你! – 2009-11-16 12:53:06
我也選擇了後者,但仍想在這裏看到嚴格的文字答案。也許可以指出這種運動的毫無意義。 (現在,如果問題中提到「二進制補碼有符號整數」或「算術邏輯」而不是「C」,那應該是另一回事了。) – aib 2009-11-16 13:27:20
這是一個比較兩個數字而不使用關係運算符(它也適用於負數)的程序。
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();
}
我覺得現在的代碼非常適用於所有輸入...
@Maddy:選擇你的代碼並按下'ctrl + k'來正確格式化它在這裏。此外,請妥善縮進它(就像我爲你做的那樣)。 – Stephan202 2009-11-16 12:54:44
@Maddy,下一次,請更新/編輯您的上一個答案,而不是發佈一個新的答案。 – Stephan202 2009-11-16 12:55:31
@stephan 好吧,先生,因爲我是新來的,我不知道這一點。從現在開始,我會遵循它。 謝謝你。 – Madhan 2009-11-16 13:00:12
請記住,邏輯運算符比算術運算符快得多。
至於你的答案...
if(x-y){ elements are different}else{ they are equals}
您確定這一說法嗎?在現代CPU中,大多數(所有?)整數運算在1個週期內完成,而邏輯通常意味着跳躍和跳躍通常意味着傾倒的管線。 – 2009-11-16 12:55:50
實際上沒有:) JMP指令被CPU中的分支預測器檢測到,並且甚至在需要執行之前就被優先考慮。 8-32字節的算術運算速度更快,因爲MMX實際上比較慢(不太確定,但我想這很容易找到) 「傾倒的管道」發生在doiung調用時,不是本地(小)跳轉。 – Quamis 2009-11-18 08:49:59
這是卡爾的邪惡的雙胞胎,在這裏告訴你,你的所有弱小的弱者!
這裏有一點不只是沒有邏輯運算符也沒有關係運算符(包括==
)和沒有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
的幾個會輕鬆做到這一點。
+1因爲我喜歡這個解決方案,因爲它不使用'if',這感覺就像是作弊。 – 2010-07-21 16:56:06
因爲你在'sign(x)'的實現中隱藏了你的條件邏輯,所以我很想投票-1。你認爲'sign(x)'做什麼? AFAIK,沒有「邏輯運算符」(有條件)邏輯的內在實現。 – 2013-05-16 15:50:20
@Mark Lakata:至少在我的程序中,我完全知道*什麼符號()所做的事情!如果你仔細閱讀我的代碼(第3-5行),你也會看到它。 – 2013-05-17 18:22:28
試試這個:
if(a-b)
printf("They are not equal");
else
printf("They are equal");
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
只有a
和b
是相同的。 因此,只有在a
和b
不同時,我們才處於第一個開關的默認情況。
現在從a
和b
服用min
(這裏是訣竅,有一個隱含的,如果與Math.min
函數內部邏輯運算符),我們可以用這個min
減去a
。如果結果爲0
那意味着a
小於b
。
最後一種情況是剩下的一種,所以a
大於b
。 使用if
子句(0
→false
,其他→true
)接受整數的語言可以使用if
而不是switch
(不適用於java)。
你可能應該解釋你的代碼。 – md5 2012-10-20 16:25:51
完成:)是否清楚? – 2012-10-31 09:10:19
是C#嗎? C沒有'System.out.println'或'Math.min'。 – 2013-05-13 15:50:15
好的。 a-b
是顯而易見的,但是接着檢查a<b
或a>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;
}
多處未定義的行爲和其他問題。 – Olaf 2018-03-09 18:19:47
如果你不介意低效的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;
}
你想得到什麼結果? – 2009-11-16 09:24:23
我很確定這是一個dup,但找不到較舊的問題。考慮到另一個問題有一個明確的編碼解決方案,這可能是一件好事。 – outis 2009-11-16 09:44:49
正如Sam152所提到的,您可以始終使用XOR(^中的^運算符)來表達文本。如果(a^b == 0) - >它們是相等的 – 2009-11-16 13:13:55