【2021全国高校计算机能力挑战赛C++题目】17.信息整理 某机房上线了一套系统,和每台计算机都相连,以便监控各计算机相关外设的运行状态。
17.信息整理 某机房上线了一套系统,和每台计算机都相连,以便监控各计算机相关外设的运行状态。各计算机的返回信号映射为一个0-15的数,其中从左到右第0位为1表示键盘故障、第1位为1表示鼠标故障、第2位为1表示显示故障、第3位为1表示声音故障。如7对应0111,表示鼠标、显示、声音同时故障。先输入这N台计算机的状态,请统计键盘或者鼠标故障的计算机数量。输入说明:第一行是一个N (0<N≤1000)
·
17.信息整理
某机房上线了一套系统,和每台计算机都相连,以便监控各计算机相关外设的运行状态。各计算机的返回信号映射为一个0-15的数,其中从左到右第0位为1表示键盘故障、第1位为1表示鼠标故障、第2位为1表示显示故障、第3位为1表示声音故障。
如7对应0111,表示鼠标、显示、声音同时故障。
先输入这N台计算机的状态,请统计键盘或者鼠标故障的计算机数量。
输入说明:
第一行是一个N (0<N≤1000) ,表示计算机的数量。接下来N行,每行是一 个0-15的数字。
输出说明:
一个整数,示机房里键盘或者鼠标故障的计算机数目。
输入样例: .
5
12
0
0
2
4
输出样例:
2
代码(仅供参考):
方法一:
#include <iostream>
using namespace std;
int main()
{
int N;
cin >> N;
int num[N];
for (int i = 0; i < N; i++)
{
cin >> num[i];
}
int count = 0; //用于统计转换之后的二进制中第一位或者第二位为1的个数
for (int i = 0; i < N; i++)
{
int a[4] = {2, 2, 2, 2}; //初始时,二进制的4位都标记为2
int j = 0, flag = num[i];
//十进制转换为二进制
while (flag)
{
a[j] = flag % 2;
flag /= 2;
j++;
}
//转换之后并不是4位,例如:4转换之后是10,而不是0010(其中数组a中是“2210”);所以进行下面步骤使其变为4位
for (flag = 3; flag >= 0; flag--)
{
if (a[flag] == 2) //将初始未做转换的位置变为0
{
a[flag] = 0;
}
// cout << a[flag]; //输出转换之后的结果(第一位或者第二位若为1,后面的几位不输出)
if (flag == 3 || flag == 2)
{
if (a[flag] == 1)
{
count++;
break; //第一位判定为1之后,(结束循环),就不去判断第二位;
}
}
}
// cout << endl;
}
cout << count;
return 0;
}
方法二:
#include <iostream>
#include <bitset>
using namespace std;
int main()
{
int N;
cin >> N;
int num[N];
for (int i = 0; i < N; i++)
{
cin >> num[i];
}
int count = 0; //用于统计
for (int i = 0; i < N; i++)
{
bitset<4> temp(num[i]); //长度为4,默认以0填充
// cout << temp << endl;
if (temp[2] == 1 || temp[3] == 1)
{
count++;
}
}
cout << count << endl;
return 0;
}
演示及说明:


(上图说明是针对于方法一的)

(上图说明是针对于方法一的)
题目原截图:

如果代码中有错误或者考虑不周的情况,欢迎指正~
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)