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

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