题目:
链接:https://www.nowcoder.com/questionTerminal/70d4325140e944b2a07ec0e0a6d778e2?pos=10&orderByHotValue=1
来源:牛客网
今天的计算机课上,老师给同学们出了一道题:
输入n个数,请将其中的偶数的二进制反转。
eg:输入1 6 5
其中6是偶数,二进制表示为110,反转后为011,代表3,所以最终输出1 3 5.
小贱君最近脑子不怎么好使,想了半天也没想出来如何做,最后他向你寻求帮助了,帮帮可怜的小贱君吧!
输入描述:
输入包含多组测试数据。
对于每组测试数据:
N --- 输入的数字个数
N个数:a0,a1,...,an-1
保证:
1<=N<=3000,0<=ai<=INT_MAX.
输出描述:
对于每组数据,输出N个整数。
示例1
输入
5
1 3 10 6 7
6
26 52 31 45 82 34
输出
1 3 5 3 7
11 11 31 45 37 17
思路:就是判断奇数偶数,奇数返回,偶数就翻转,翻转可以借助整数翻转的思路
链接:https://www.nowcoder.com/questionTerminal/70d4325140e944b2a07ec0e0a6d778e2?pos=10&orderByHotValue=1
来源:牛客网
#include <iostream>
using namespace std;
int flipNum(int x){
if (x & 1) return x; //奇数返回
int n = 0;
while (x){
n = (n << 1) | (x & 1); //每次将x最后一位拿出来挂到n上
x = x >> 1;
}
return n;
}
int main(){
int N;
int x;
while (cin >> N){
for (int i = 0; i < N; ++i){
cin >> x;
cout << flipNum(x);
if (i != N - 1) cout << \" \"; //打印回车
}
cout << endl;
}
}
如果不理解 上面的核心代码,举个例子偶数6的二进制是110,
| n=(n<<1) | (x&1); | x=x>>1; |
| n= 0 | 0 | x=3 //二进制11 |
| n= 0 | 1 //n=1 | x=1 //二进制1 |
| n= 2 | 1 //n<<1=2也就是二进制10 .这句相当于010 | 001=011 | x=0 |
版权声明
本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。



