HW 2020.8.26笔试第一题
题目描述
对输入n个无符号整数,进行二进制的移位和调换进行加扰,加扰后仍能保持n个整数。
输出加扰后的n个整数,两个整数之间空格分开。
加扰步骤:
1.先把每个整数每两个bit交换位置,如bit0和bit1交换,bit2和bit3交换,以此类推。
2.再把每个整数向右移2位,溢出的部分,第一个整数的最低2bit移到第二个整数的最高两bit上,第二个整数的最低2bit移到第三个整数的最高两bit上,以此类推,最后一个整数的最低2bit移到第一个整数的最高2bit上。如果输入只有一个整数,溢出的2bit移到自己的最高2bit上。
说明,无符号整数的范围不超过32bit整数大小。
输入描述
输入n个无符号整数,两个整数直接用空格分开,n不超过1000。
输出描述
输出加扰后的无符号整数,两个整数直接用空格分开。
示例1
输入
1 2
输出
1073741824 2147483648
解题
#include <iostream>
#include <vector>
using namespace std;
void move(vector<vector<int>>& num) { //加扰1:两两交换
for (int i = 0; i < num.size(); i++) {
for (int j = 0; j < 32; j += 2) {
int tmp = num[i][j];
num[i][j] = num[i][j + 1];
num[i][j + 1] = tmp;
}
}
}
void change(vector<vector<int>>& num) { //加扰2:移位
int len = num.size();
int a0 = 0, a1 = 0; //保存后两位
int b0 = 0, b1 = 0; //上个数的后两位
for (int i = 0; i < len; i++) {
a0 = num[i][30];
a1 = num[i][31];
for (int j = 29; j>=0; j--) {
num[i][j + 2] = num[i][j];
}
num[i][0] = b0;
num[i][1] = b1;
b0 = a0; //将保存的后两位 保存为 上一个
b1 = a1;
}
num[0][0] = b0;
num[0][1] = b1;
}
int main() {
vector<vector<int>> num;
unsigned int n;
while (cin>>n) {
vector<int> tmp(32); //保存每个数的二进制格式
int i = 31;
while (n > 0) {
tmp[i--] = n % 2;
n /= 2;
}
num.push_back(tmp);
}
move(num); //加扰1
change(num); //加扰2
for (int i = 0; i < num.size(); i++) { //二进制转整数输出
unsigned int res = 0;
for (int j = 0; j < 32; j++) {
res *= 10;
res += num[i][j];
}
cout << res << " ";
}
cout << endl;
return 0;
}