因为此题槽点太多,因此没忍住...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; } }