題目鏈接:http://acm.nyist.net/JudgeOnline/problem.php?pid=529
由於此題槽點太多,所以沒忍住...
吐槽Time:
看到這題通過率出奇的高然後愉快的進來想水掉...but...
一開始狂百度找討論區也完全看不懂題意啊,
還好後來通過這些零碎的線索補腦了下面的題意,
能AC但不很確定484題目本意,希望對大家有幫助(話說這樣會不會幫倒忙啊^_^).
題目意思:
要通過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的位置.)
我去,終於可以寫代碼了..最近漫畫看多了,不知不覺吐了這麼多槽,這麼難得不能浪費得寫到博客裡去,哈哈哈哈
//對於我這種單純boy來說還是來段我的簡單走心的暴力法吧,超時什麼的咱不慫,哈哈,(提交後AC的說,嘿嘿)
1 #include<iostream> 2 using namespace std; 3 int main() { 4 int T, x, n; 5 cin >> T; 6 while(T--) { 7 cin >> x; 8 n = 0; 9 int y = x%2; 10 do { 11 y = x%2; 12 x /= 2; 13 n++; 14 } while(y != 0); 15 cout << n << endl; 16 } 17 } <代碼實現>點擊展開開始寫於:2016.9.9 ----志銀