2025_11_7_刷题
文章目录
- 2025_11_7_刷题
-
- 一、前言
- 二、刷题
-
- [2.1 老式计算机](#2.1 老式计算机)
-
- [2.1.1 分析题目](#2.1.1 分析题目)
- [2.1.2 思维发散](#2.1.2 思维发散)
- [2.1.3 思路整理](#2.1.3 思路整理)
- [2.1.4 代码](#2.1.4 代码)
- [2.1.5 总结](#2.1.5 总结)
- [2.2 表达式求值](#2.2 表达式求值)
-
- [2.2.1 分析题目](#2.2.1 分析题目)
- [2.2.2 思维发散](#2.2.2 思维发散)
- [2.2.3 思路整理](#2.2.3 思路整理)
- [2.2.4 代码](#2.2.4 代码)
- [2.2.5 总结](#2.2.5 总结)
- [2.3 表达式求值](#2.3 表达式求值)
-
- [2.3.1 分析题目](#2.3.1 分析题目)
- [2.3.2 思维发散](#2.3.2 思维发散)
- [2.3.3 思路整理](#2.3.3 思路整理)
- [2.3.4 代码](#2.3.4 代码)
- [2.3.5 总结](#2.3.5 总结)
- [2.4 信息整理](#2.4 信息整理)
-
- [2.4.1 分析题目](#2.4.1 分析题目)
- [2.4.2 思维发散](#2.4.2 思维发散)
- [2.4.3 思路整理](#2.4.3 思路整理)
- [2.4.4 代码](#2.4.4 代码)
- [2.4.5 总结](#2.4.5 总结)
- 三、小结
一、前言
今天是刷题的第3天,今天是关于字符串的几道题目。
二、刷题
2.1 老式计算机
------计挑赛2021年C++组真题
老式的计算机只能按照固定次序进行运算,华安大学就有这样一台老式计算机,计算模式为A @ B #C,@和#为输入的运算符(可能是+、-或*,运算符优先级与C++一致),现给出A,B,C的数值以及@和#对应的运算符,请你编写程序,验证老式计算机的运行结果。
输入说明: 第一行是一个整数N(|N|≤10000),表示有N组计算数据需要处理,接下来N行,每行是相应的数据,包括三个整数和两个运算符,分别对应A、@、B、#和C。
输出说明: 对每行输入的数据,输出计算结果。
输入样例: 3
1+2*3
3*2-1
5+7-9
输出样例: 7
5
3
2.1.1 分析题目
题意大致为该计算机有一个固定的计算模板,对于抛出的计算表达式,能够给出正确的答案。
- 计算符号只有3种
+ - * - 模板不是一般的固定------只有3个数字和2个符号
2.1.2 思维发散
本题的难点在于计算优先级的规定。
我一开始想的是用stoi直接将表达式计算出来,但是stoi是不能处理符号,只是转化为数字,直到不是数字就会自动终止。
2.1.3 思路整理
- 自定义优先级
- 定义一个计算函数,专门用来计算表达式
- 循环输出答案
2.1.4 代码
cpp
#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
int n;
int a, b, c;
char ch1, ch2;
int ans;
// 计算优先级
int prior(char c)
{
if(c == '*')
return 2;
if(c == '+' || c == '-')
return 1;
return 0;
}
// 计算表达式
int calculate(int a, int b, char ch)
{
switch(ch)
{
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
default: return 0;
}
}
int main()
{
cin >> n;
while(n--)
{
cin >> a >> ch1 >> b >> ch2 >> c;
if(prior(ch1) < prior(ch2))
{
int temp = calculate(b, c, ch2);
ans = calculate(a, temp, ch1);
}
else
{
int temp = calculate(a, b, ch1);
ans = calculate(temp, c, ch2);
}
cout << ans << endl;
}
return 0;
}
结果:

2.1.5 总结
本题的输入输出和我今天做的另一道很像,同样是固定了模板,输入都是一个一个字符输入,处理思路也很简单。我都想难了------以为要处理字符串。有时解题时也要仔细揣度出题者的用意是考什么。比如这题主要考察运算符的优先级。
2.2 表达式求值
------计挑赛2021年C++组真题
老式的计算机只能按照固定次序进行运算,华安大学就有这样一台老式计算机,计算模式为A @ B #C,@和#为输入的运算符(可能是位运算符&、|、^,须考虑计算优先级),现给出A,B,C的数值以及@和#对应的运算符,请你编写程序,验证老式计算机的运行结果。
输入说明: 第一行是一个整数N(|N|≤10000),表示有N组计算数据需要处理,接下来N行,每行是相应的数据,包括三个整数和两个运算符,分别对应A、@、B、#和C。
输出说明: 对每行输入的数据,输出计算结果。
输入样例: 3
1&2|3
3|2^1
5^7|9
输出样例: 3
3
11
2.2.1 分析题目
这个题和上一个题一样,不过考验的运算符升级了------& | ^
2.2.2 思维发散
感觉这个题考察不在算法,而是对于运算符的理解程度。
不过还真被他考着了,这个运算符我不咋熟悉------补一下~
总结如下:
运算优先级:~ (按位取反) << >> (移位) & (按位与) ^ (按位异或) | (按位或)
符号释义:
&------按位与------全1为1,有0为0^------按位异或------相同为0,不同为1|------按位或------有1为1,全0为0
2.2.3 思路整理
和上题思路一致
只是要把运算符的优先级函数改一下符号
2.2.4 代码
cpp
#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
int n;
int a, b, c;
char ch1, ch2;
int ans;
// 计算优先级
int prior(char c)
{
if(c == '&')
return 3;
if(c == '^')
return 2;
if(c == '|')
return 1;
return 0;
}
// 计算表达式
int calculate(int a, int b, char ch)
{
switch(ch)
{
case '&': return a & b;
case '^': return a ^ b;
case '|': return a | b;
default: return 0;
}
}
int main()
{
cin >> n;
while(n--)
{
cin >> a >> ch1 >> b >> ch2 >> c;
if(prior(ch1) < prior(ch2))
{
int temp = calculate(b, c, ch2);
ans = calculate(a, temp, ch1);
}
else
{
int temp = calculate(a, b, ch1);
ans = calculate(temp, c, ch2);
}
cout << ans << endl;
}
return 0;
}
结果:

2.2.5 总结
这种运算符日常做题确实不咋用,好吧~将来要成为一个大佬,就是要什么都会
2.3 表达式求值
------计挑赛2021年C++组真题
老式的计算机只能按照固定次序进行运算,华安大学就有这样一台老式计算机,计算模式为A @ B #C,@和#为输入的运算符(可能是+、*、%,须考虑计算优先级),现给出A,B,C的数值以及@和#对应的运算符,请你编写程序,验证老式计算机的运行结果。
输入说明: 第一行是一个整数N(|N|≤10000),表示有N组计算数据需要处理,接下来N行,每行是相应的数据,包括三个整数和两个运算符,分别对应A、@、B、#和C。
输出说明: 对每行输入的数据,输出计算结果。
输入样例: 3
1+2*3
3%2+1
5+7%9
输出样例: 7
2
12
2.3.1 分析题目
不用多说了------运算符改为了+ * %
2.3.2 思维发散
无
2.3.3 思路整理
CV
2.3.4 代码
cpp
#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
int n;
int a, b, c;
char ch1, ch2;
int ans;
// 计算优先级
int prior(char c)
{
if(c == '+')
return 1;
if(c == '*' || c == '%')
return 2;
return 0;
}
// 计算表达式
int calculate(int a, int b, char ch)
{
switch(ch)
{
case '+': return a + b;
case '%': return a % b;
case '*': return a * b;
default: return 0;
}
}
int main()
{
cin >> n;
while(n--)
{
cin >> a >> ch1 >> b >> ch2 >> c;
if(prior(ch1) < prior(ch2))
{
int temp = calculate(b, c, ch2);
ans = calculate(a, temp, ch1);
}
else
{
int temp = calculate(a, b, ch1);
ans = calculate(temp, c, ch2);
}
cout << ans << endl;
}
return 0;
}
结果:

2.3.5 总结
无
2.4 信息整理
------计挑赛2021年C++组真题
某机房上线了一套系统,和每台计算机都相连,以便监控各计算机相关外设的运行状态。各计算机的返回信号映射为一个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
2.4.1 分析题目
题意为每个二进制位表示一种计算机的故障位置。输入是十进制数,要求统计从左向右第1位是1或者第2位为1的数字个数。
2.4.2 思维发散
这个和我的第二篇刷题中最后一道有相似之处,都涉及十进制转任意进制。
写过那道,这道相对来说属实是舒适区啦~
2.4.3 思路整理
- 将输入的10进制转为2进制
- 遍历2进制的前两位。看是否为1
- 统计答案
2.4.4 代码
cpp
#include<iostream>
using namespace std;
int n,count,num;
char s[4];
void o_to_b(int x, char b[])
{
for(int i = 0; i < 4; i++)
{
b[i] = x % 2;
x = x/2;
}
}
int main()
{
cin >> n;
while(n--)
{
cin >> num;
o_to_b(num, s);
if(s[3] == 1 || s[2] == 1)
{
count++;
}
}
cout << count << endl;
return 0;
}
结果:

2.4.5 总结
本题还好。
三、小结
今日份刷题挺有水分的哈~但好得是真题(同一套的),明天继续!