這題是寧波區(qū)域賽的熱省賽中的一題……
后來偶然發(fā)現(xiàn)時POJ上的,而且有人用位運算搞過了,于是就去學(xué)位運算,通過Matrix67大牛的三篇文章學(xué)的,第四篇還沒看,(想看的可以去搜下Matrix67或者去我前面的文章找下,應(yīng)該是sgu那篇,可以找到鏈接)
這題可以這么想,比如原數(shù)x=0101110的下一個是01100011,你可以這樣想,以要比原數(shù)大,必須把原數(shù)的最右邊的一段1(連續(xù)的,如果只有一個的,就是一個)變成0,把這段1的右邊的第一個0變成1,然后再在所得的數(shù)的最右邊補1,知道1的位數(shù)一樣。
這樣的話,我們就可以這樣做了
設(shè)原數(shù)為x
然后t = x + (x & -x);//(x & -x) 取x的最右邊的一個1,因為"把原數(shù)的最右邊的一段1變成0"可以加上最右邊一個1
接下來就是補1的過程了,當(dāng)然可能不用補
好吧我們用一個函數(shù)得到x(10進制)在2進制表示下的1的個數(shù)(如果有看不懂的,建議先看下Matrix67大牛的位運算在看,當(dāng)然到那個時候基本你自己也可以寫了,不必要看我的了,呵呵)
函數(shù)如下
get

這樣我們就基本是完成了。具體代碼如下,個人建議先自己想,實在想不出來之后再看我的代碼
CODE