1. 程式人生 > >[程式設計題]偶數大翻轉

[程式設計題]偶數大翻轉

題目:

連結: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