求1到n這n個整數間的異或值(O 1 演算法)

2021-09-24 21:12:33 字數 1225 閱讀 3044

問題:求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...