問題:求1到n這n個整數間的異或值,即 1 xor 2 xor 3 ... xor n
記 f(x, y) 為x到y的所有整數的異或值。
2^k 到 2^(k+1) -1 這2^k個數,最高位(+k位)的1個數為2^k,
若 k >= 1,則2^k為偶數,將這2^k個數的最高位(+k位)去掉,異或值不變。
因而 f(2^k, 2^(k+1) -1) = f(2^k - 2^k, 2^(k+1) -1 -2^k) = f(0, 2^k -1)
因而 f(0, 2^(k+1) -1) = f(0, 2^k -1) xor f(2^k, 2^(k+1) -1) = 0 (k >= 1)
即 f(0, 2^k - 1) = 0 (k >= 2)
對 f(0, n) (n >= 4) 設n的最高位1是在+k位(k >= 2),
f(0, n) = f(0, 2^k - 1) xor f(2^k, n) = f(2^k, n)
對2^k到n這n+1-2^k個數,最高位(+k位)共有 m = n+1-2^k 個1,去除最高位的1
當n為奇數時,m是偶數,因而 f(0, n) = f(2^k, n) = f(0, n - 2^k)
由於n - 2^k 與 n同奇偶,遞推上面的公式,可得:f(0, n) = f(0, n % 4)
當 n % 4 == 1 時, f(0, n) = f(0, 1) = 1
當 n % 4 == 3 時, f(0, n) = f(0, 3) = 0
當n為偶數時,m是奇數,因而 f(0, n) = f(2^k, n) = f(0, n - 2^k) or 2^k
也就是說,最高位1保持不變,由於n - 2^k 與 n同奇偶,遞推上面的公式,
可得:f(0, n) = nn or f(0, n % 4) (nn為 n的最低2位置0)
當 n % 4 == 0 時, f(0, n) = n
當 n % 4 == 2 時, f(0, n) = nn or 3 = n + 1 (公式對 n = 2仍成立)
綜上所述:
f(1, n) = f(0, n) =
n n % 4 == 0
1 n % 4 == 1
n +1 n % 4 == 2
0 n % 4 == 3
**:unsigned xor_n(unsigned n)
參考: 求從1到n這n個整數的十進位制表示中1出現的次數
原文連線 題目 輸入乙個整數n,求從1到n這n個整數的十進位制表示中1出現的次數。例如輸入12,從1到12這些整數中包含1 的數字有1,10,11和12,1一共出現了5次。分析 這是一道廣為流傳的google面試題。簡單的方法就是按照給位進行分析 在個位出現1的個數 n 10 個位 0,0 個位 1...
求1到N的所有整數中「1」的個數
題意 給定乙個十進位制的整數n,求1到n的所有整數中 1 出現的個數 解題思路 最簡單的一種方法是對1到n中的每個整數的每一位進行判斷,使用除法與取餘的方式,這種方法的時間複雜度是o n logn 解法一 程式設計之美中通過分析,總結了這樣的乙個規律 假設要處理的資料n abcde,現在要計算百位上...
從1到n這n個整數的十進位制表示中1出現的次數
今天遇到乙個題目,求1到n個整數中1出現的次數,這是以前寫過的題目 include include int main printf 含有1的個數為 d n sum return 0 現又從新寫了乙個,並附上思路 include int main printf 含有1的個數為 d n sum retu...