無論原碼、反碼還是補碼,第一位都是符號位,當第一位為 00 時,表示非負數;反之表示負數。
原碼:除符號位外,餘下位上的數為原數的絕對值(注意,這裡是二進位制)。
反碼:非負數的反碼就是其本身;負數的反碼是在原碼的基礎之上,符號位不變,餘下的所有位取反。
補碼:非負數的補碼就是其本身;負數的補碼就是在反碼的基礎之上 +1+1。
我們通過如下幾個例子來進一步理解原碼、反碼和補碼:
十進位制數 原碼 反碼 補碼
8585 0101 0101 0101 0101 0101 0101
-85−85 1101 0101 1010 1010 1010 1011
99 0000 1001 0000 1001 0000 1001
-9−9 1000 1001 1111 0110 1111 0111
不過蒜頭君今天想讓你嘗試計算的不是 88 位的補碼,而是 3232 位的補碼,因為int是 44 位元組 3232 位的。3232 位的補碼是最高一位為符號位,剩下 3131 位是跟數的大小有關的。
蒜頭君會把乙個 3232 位補碼給你,讓你幫忙算一下它對應的十進位制數是多少。
輸入格式
輸入第一行,包含乙個僅有』0』, '1』組成的字串,且長度為 3232 。
輸出格式
輸出一行,包含乙個整數,表示這個補碼對應的十進位制數。
資料範圍
對於 60%60% 的資料,補碼最高位為』0』。
對於 100%100% 的資料,字串僅由』0』, '1』組成,且長度為 3232 。
輸出時每行末尾的多餘空格,不影響答案正確性
樣例輸入1 複製
00000000000000000000000001010101
樣例輸出1 複製
85樣例輸入2 複製
11111111111111111111111110101011
樣例輸出2 複製
-85思路:一開始將補碼想麻煩了,反碼換補碼,只用結果+1即可。
直接按題意模擬即可。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
#define n 100010
using namespace std;
const
int maxn =
100000+5
;char a[maxn]
;int
main()
if(a[i]
=='1')}
}}else
if(a[0]
=='1')if
(a[i]
=='1')}
}if(a[0]==
'1')
printf
("-%lld\n"
,sum+1)
;else
printf
("%lld\n"
,sum)
;return0;
}
計蒜客刷題 1
1.資料範圍 相信你已經學會 a ba b 問題了,那麼問題又來了 輸入兩個正整數 aa 和 bb 求a b。輸入格式 一行,包含兩個正整數 a 和 b,中間用單個空格隔開。1 a,b 50000。輸出格式 乙個整數,即a b 的值。include using namespace std intma...
計蒜客(數學題)
a i 1 2a i 2c i a i 1 假設a 1 0的情況下帶進去,然後把最後真正的a n 1 和假設出來的a n 1 相減然後除以 n 1 就是答案。這裡的n 1是通過規律看出來的。include include include include include include include...
2017計蒜客複賽簽到題
確實,最近臨近期末,各種事情要多起來了,這估計是這學期最後一次acm的題了。由於時間因素只做了一道簽到題就匆匆走人,不過完美ac簽到題,也算是給這學期的acm畫上了乙個圓滿的句號了吧,開始了自己的部落格生涯,挺好。思路 這題根據題意,很容易想到直接模擬,而資料範圍顯示可以直接開二元陣列強行記錄,而對...