码迷,mamicode.com
首页 > 其他好文 > 详细

(笔试题)二进制1的个数相同的距离最小数

时间:2015-06-15 21:49:26      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:

题目:

输入:整数A
输出:整数B
条件:A和B的二进制1的个数相同,且A和B之间的距离|A-B|最小。

思路:

根据题意,A和B的二进制1的个数相同,且要求距离最小,那么A和B的差别就在于相邻的bit位,如1100和1010,0011和0101等。

当A的最后一位(低位)为0,则找到最后(右边)一位1,然后将该1与左边的0交换,即得到B;如1100和1010

当A的最后一位(低位)为1,则找到最后(右边)一位0,然后将该0与右边的1交换,即得到B。如0011和0101

代码:

#include <iostream>

using namespace std;

int sameSumOfOne(int a){
    if(a==0)
        return 0;
    int b=0;
    int pos=0;
    if((a&1)==0){
        while(((a>>pos)&1)==0)
            pos++;
        b=a-(1<<pos)+(1<<(pos-1));
    }
    else{
        while(((a>>pos)&1)==1)
            pos++;
        b=a-(1<<(pos-1))+(1<<pos);
    }
    return b;
}

int main()
{
    int a[]={0,1,2,3,4,5,6,7,8,9,10};
    int n=sizeof(a)/sizeof(a[0]);
    for(int i=0;i<n;i++)
        cout<<a[i]<<" "<<sameSumOfOne(a[i])<<endl;
    cout<<endl;
    return 0;
}

运行结果:

技术分享

 

(笔试题)二进制1的个数相同的距离最小数

标签:

原文地址:http://www.cnblogs.com/AndyJee/p/4579086.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!