因爲此題槽點太多,因此沒忍住...php
看到這題經過率出奇的高而後愉快的進來想水掉...but...
一開始狂百度找討論區也徹底看不懂題意啊,
還好後來經過這些零碎的線索補腦了下面的題意,
能AC但不很肯定484題目本意,但願對你們有幫助(話說這樣會不會幫倒忙啊^_^).ios
要經過x的二進制的任意位置上的數(0變爲1,或1變爲0)使十進制的x變爲x+1, 一次只能改變二進制的x的一位,求最少須要的次數.哈哈!算法
經過人工打草稿的方法加上手指和快速的心算在紙上(這算神馬算法0.0)算出了1~5的結果,過程簡單描述以下
1(0001) ->0011->0010 ->2(0010)=>變2次
2(0010) ->0011 ->3(0011)=>變1
3(0011) ->0111->0110->0100 ->4(0100)=>變3
4(0100) ->0101 ->5(0101)=>變1
5(0101) ->0111->0110 ->6(0110)=>變2
哈哈,獲得規律:x的二進制數從1開始從右往左數第一個0的位置是幾就最少須要改變幾回。
(ps:話說這麼長的原理連本身都以爲有點像說了和沒說同樣)
(規律原理:最少改變次數爲x的二進制加1後包括進位所改變的位置數,二進制加1的進位改變中止於x的二進制數從右往左數第一個0的位置.)
我去,終於能夠寫代碼了..最近漫畫看多了,不知不覺吐了這麼多槽,這麼可貴不能浪費得寫到博客裏去,哈哈哈哈spa
//對於我這種單純boy來講仍是來段個人簡單走心的暴力法吧,超時什麼的咱不慫,哈哈,(提交後AC的說,嘿嘿).net
#include<iostream> using namespace std; int main() { int T, x, n; cin >> T; while(T--) { cin >> x; n = 0; int y = x%2; do { y = x%2; x /= 2; n++; } while(y != 0); cout << n << endl; } }