[問題] 不用if-else, for, while, do-while取絕

看板C_and_CPP作者 (加州貓)時間8年前 (2016/04/06 23:33), 8年前編輯推噓8(8023)
留言31則, 15人參與, 最新討論串1/5 (看更多)
對一個整數取絕對值 如果不用到if-else, for, while, do-while 可以使用什麼方法 我想到的都是會用到上列的限制... 請前輩指教 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 182.234.148.56 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1459956797.A.FD4.html ※ 編輯: CaliforCat (182.234.148.56), 04/06/2016 23:35:25

04/06 23:35, , 1F
#include<stdlib.h> int abs(int);
04/06 23:35, 1F

04/06 23:39, , 2F
goto (?)
04/06 23:39, 2F

04/06 23:41, , 3F
int pos = ((num < 0) ? (num * -1) : (num));
04/06 23:41, 3F

04/06 23:48, , 4F
補數?
04/06 23:48, 4F

04/06 23:50, , 5F
能請問為甚麼不能用這些方法嗎?
04/06 23:50, 5F

04/06 23:51, , 6F
應該是跟人打賭吧,接受板眾插花嗎?
04/06 23:51, 6F

04/07 00:05, , 7F
相乘再開根號就好啦 國中就有教了(被打
04/07 00:05, 7F

04/07 00:23, , 8F
num = num & (~(1<<(sizeof(int)*8-1)));
04/07 00:23, 8F

04/07 00:23, , 9F
這樣試試看?我剛想到的
04/07 00:23, 9F

04/07 00:25, , 10F
錯了 ˊˋ
04/07 00:25, 10F

04/07 00:25, , 11F
num = ((~num) & (~(1 << (sizeof(int)*8 - 1)))) + 1
04/07 00:25, 11F

04/07 00:28, , 12F
還是不對
04/07 00:28, 12F

04/07 03:37, , 13F
(a < 0)? -a : a;
04/07 03:37, 13F

04/07 04:32, , 14F
a*((a>0)*2-1)
04/07 04:32, 14F

04/07 08:08, , 15F
其實龜毛點上面都算是if-else跟if
04/07 08:08, 15F

04/07 08:11, , 16F
不過C大的方法讓我知道怎麼簡化了XD
04/07 08:11, 16F

04/07 08:28, , 17F
-x = ~x + 1 ??
04/07 08:28, 17F

04/07 08:31, , 18F
Yes
04/07 08:31, 18F

04/07 08:31, , 19F
看錯了,忽略我的 @@
04/07 08:31, 19F


04/08 02:36, , 21F
不就 num &= -num 就好了嗎?
04/08 02:36, 21F

04/08 02:37, , 22F
對 int 應該是 OK 的
04/08 02:37, 22F

04/08 07:39, , 23F
呃…應該是(int)((unsigned)num &= (unsigned)-num) 才
04/08 07:39, 23F

04/08 07:39, , 24F
04/08 07:39, 24F

04/08 09:32, , 25F
-5 & 5 = 1 ?
04/08 09:32, 25F

04/08 10:06, , 26F
想到最簡單的做法就是,num*(1-2*符號)num為正,符號
04/08 10:06, 26F

04/08 10:06, , 27F
為0,就為num*1得解,反之*-1,負負得正,亦得解
04/08 10:06, 27F

04/08 10:07, , 28F
怎麼找出符號,只要用shift就可以達成了
04/08 10:07, 28F

04/11 07:14, , 29F
沒說不能用switch呀,ㄎㄎ
04/11 07:14, 29F

04/11 07:15, , 30F
switch(num < 0) case true: return (num * -1);
04/11 07:15, 30F

04/11 17:54, , 31F
switch裡的嚴格講來算是if else
04/11 17:54, 31F
文章代碼(AID): #1N1Imz_K (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1N1Imz_K (C_and_CPP)