首页 > 8.26华为机试第一题,IDE测试完案例,提交直接AC
头像
智慧树不长树叶
编辑于 2020-08-27 15:43
+ 关注

8.26华为机试第一题,IDE测试完案例,提交直接AC

简单暴力,没有任何技巧,C++代码
原题目描述。(题目中提示,每个数字的二进制为32bit)
1.输入n个无符号整数
2.给每个数字增加干扰措施。
2.1 干扰1:让每个整数的二进制位置上的数字交换,即(2*i)与(2*i+1)交换,i=0:15。以下讨论说的都是二进制数。
2.2 干扰2:假设三个数a,b,c,a(XXXXXXXXXXa2a1)的最后两位弹出a1,a2;a1,a2进入b的头,同时b的最后两位b1b2弹出,此时b变为(a2a1XXXXXXXXXXXX),c同理,变为(b2b1XXXXXXXXXXXX),将c的尾巴c1c2弹入a的头,a变为(c2c1XXXXXXXXXXXXX)。
最终效果:
a(XXXXXXXXXXXXa2a1)->(c2c1XXXXXXXXXXXXX);
b(XXXXXXXXXXXXb2b1)->(a2a1XXXXXXXXXXXX);
c(XXXXXXXXXXXXc2c1)->(b2b1XXXXXXXXXXXX);
。。。。。。应该叙述清楚了。倘若只有一个数a,这个应该好分析
3.输出每个***扰后的数字(十进制的,同空格隔开)。
#include<iostream>
#include<vector>
#include<string>
#include<unordered_map>
#include<algorithm>
using namespace std;
string zhuanhuan1(unsigned int a)//将数转换为32位数的二进制
{
	string temp;
	int t = 0;
	for (int i = 0; i < 32; i++)
	{
		t = a % 2;
		temp.push_back(t + '0');
		a = a / 2;
	}
	reverse(temp.begin(), temp.end());
	return temp;
}
unsigned int zhuanhuan2(string s)//将32为二进制的数转换为十进制数
{
	unsigned int t;
	unsigned int x = 1;
	unsigned int ans=0;
	for (int i = 31; i >=0; i--)
	{
		t = x*(s[i] - '0');
		ans += t;
		x *= 2;
	}
	return ans;
	
}

void ganrao1(string &s) //干扰措施1
{
	for (int i = 0; i < 16; i++)
		swap(s[i * 2], s[i * 2 + 1]);
}
void ganrao2(string &s,char l1,char l2) //干扰措施2
{
	s.pop_back();
	s.pop_back();
	reverse(s.begin(), s.end());
	s.push_back(l1);
	s.push_back(l2);
	reverse(s.begin(), s.end());
}
int main()
{
	//输入
	unsigned int temp;
	vector<unsigned int>arr;
	while (cin >> temp )
		arr.push_back(temp);
	vector<string>str(arr.size());
	//转换为二进制并增加干扰1
	for (int i = 0; i < arr.size(); i++)
	{
		str[i] = zhuanhuan1(arr[i]);
		//cout << str[i] << endl;
		ganrao1(str[i]);//干扰1
		//cout << str[i] << endl;
	}
	//施加干扰2
	char f_l1 = str[0][str[0].size() - 1];//第一个数的二进制后两位
	char f_l2 = str[0][str[0].size() - 2];
	char l_l1 = str[str.size() - 1][str[0].size() - 1];//最后一个数的二进制的后两位
	char l_l2 = str[str.size() - 1][str[0].size() - 2];
	if (str.size() > 1) {
		for (int i = 1; i < str.size(); i++)
		{
			char l = str[i][str[i].size() - 1];//记录当前数字的最后两位
			char r = str[i][str[i].size() - 2];
			ganrao2(str[i], f_l1, f_l2);
			//cout << "干扰2" << str[i] << endl;;
			f_l1 = l;
			f_l2 = r;
		}
	}
	ganrao2(str[0], l_l1, l_l2);
	//转换回十进制的数
	for (int i = 0; i < arr.size(); i++)
	{
		arr[i] = zhuanhuan2(str[i]);
		cout << arr[i] << " ";
	}
	return 0;
}


全部评论

(4) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

近期精华帖

热门推荐