所需知識:
正數的絕對值還是本身;
負數的絕對值是它的相反數(正數);
正整數負整數還有0在計算機裡都是以補碼的形式存放的。
正數補碼的符號位為0
負數補碼的符號位為1
乙個二進位制位與1異或相當於取反;
乙個二進位制位與0異或不變;
求乙個數相反數的補碼的一種方法是對這個數每個位取反最後加1;
所以,我們只需要取輸入數的符號位,與這個數的每個位異或,最後再加上符號位就可以求出絕對值了。
1)對正數來說:每個位與符號位0異或,其值不變,最後再加上符號位0,仍是原數。
2)對負數來說:每個位與符號位1異或,最後再加上1,想當於求它相反數的補碼,由於計算機中整數得儲存方式是補碼,所以求得結果也就是它的相反數。
3)對於0來說:雖無正負之分,但符號位也是0,所以其情況與正數一樣。
實現:
#include
intmain()
其實可以不用for迴圈直接查表,不過查表應該也屬於判斷,有點不合題意了^_^
如下:
#include
intmain()
;scanf
("%d"
,&a)
;int back = a;
int bit1 =
(a>>31)
&1;//取符號位
a = a^hh[bit1]
;//用符號位與每個位異或
a = a + bit1;
//加上符號位
printf
("fabs(%d)=%d\n"
, back, a )
;return0;
}
c 絕對值排序
problem description 輸入n n 100 個整數,按照絕對值從大到小排序後輸出。題目保證對於每乙個測試例項,所有的數的絕對值都不相等。input 輸入資料有多組,每組佔一行,每行的第乙個數字為n,接著是n個整數,n 0表示輸入資料的結束,不做處理。output 對於每個測試例項,輸...
hdu 2003 求絕對值
problem description 求實數的絕對值。input 輸入資料有多組,每組佔一行,每行包含乙個實數。output 對於每組輸入資料,輸出它的絕對值,要求每組資料輸出一行,結果保留兩位小數。sample input 123 234.00 sample output 123.00 234....
Hdoj 2003 求絕對值
problem description 求實數的絕對值。input 輸入資料有多組,每組佔一行,每行包含乙個實數。output 對於每組輸入資料,輸出它的絕對值,要求每組資料輸出一行,結果保留兩位小數。sample input 123 234.00 sample output 123.00 234....