這個題目在我以前那篇c++位運算的的隨筆中提到過。html
有興趣的話去看看吧!ios
飛機場:http://www.javashuo.com/article/p-cshhnvsm-cn.htmlc++
給出區間(a,b),b >= a,求a xor (a+1) xor (a+2).....xor ba xor (a+1) xor (a+2).....xor b。函數
輸入2個數:a b,中間用空格分隔(1 <= a <= b <= 10^9)spa
樣例:code
3 8
輸出一個答案xml
樣例:htm
11
這個題很水,上面雖說從1到10的九次方,可是數據並無那麼大,一個暴力循環也會過。blog
暴力這裏不打了,看過個人那篇位運算的同窗應該都會寫。ci
可是,咱們要追求正解。
下面是一個很好的辦法:
咱們找一找規律
從0到3這四個數異或,也就是0^1^2^3.
轉換爲二進制計算爲:
00^01^10^11=0
從4到7這四個數:
100^101^110^111=0
從8到11這四個數:
1000^1001^1010^1011=0
從12到1五、從16到19……
相信你找出規律了,這樣的每四個數異或的結果都是0.
又由於0異或全部數都不變,兩個相同的數異或得0。(具體看個人位運算那篇文章)
這樣就會有思路了。
寫一個函數work()
計算1異或到a-1的結果異或1異或到b(爲何異或到a-1不用我說吧)
就是計算結果了。
有人說計算a-1多難啊!
上面不是有方法嘛,把一個數對四取餘,按照規律異或就好,時間複雜度會控制在很小很小。
好了,思路清晰,就上代碼吧!
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 #define inf 100000000 7 int work(int x) 8 { 9 int k=x%4,ans=0; 10 x-=k; 11 for(int i=0;i<=k;i++) 12 { 13 ans=ans^(x+i); 14 } 15 return ans; 16 } 17 using namespace std; 18 int main() 19 { 20 int a,b,x,y; 21 cin>>a>>b; 22 printf("%d",work(a-1)^work(b)); 23 return 0; 24 }
代碼也很簡單哎!
今天又是一個雙更的日子,之後會把提到的題目所有寫出題解。若是感受文章有問題,就在評論區通知我!
給個贊再走吧!