[程式設計題]偶數大翻轉
阿新 • • 發佈:2019-01-01
題目:
連結: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 |