2025_11_7_刷题
2025_11_7_刷题
文章目录
- 2025_11_7_刷题
- 一、前言
- 二、刷题
- 2.1 老式计算机
- 2.1.1 分析题目
- 2.1.2 思维发散
- 2.1.3 思路整理
- 2.1.4 代码
- 2.1.5 总结
- 2.2 表达式求值
- 2.2.1 分析题目
- 2.2.2 思维发散
- 2.2.3 思路整理
- 2.2.4 代码
- 2.2.5 总结
- 2.3 表达式求值
- 2.3.1 分析题目
- 2.3.2 思维发散
- 2.3.3 思路整理
- 2.3.4 代码
- 2.3.5 总结
- 2.4 信息整理
- 2.4.1 分析题目
- 2.4.2 思维发散
- 2.4.3 思路整理
- 2.4.4 代码
- 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 代码
#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 代码
#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 代码
#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 代码
#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 总结
本题还好。
三、小结
今日份刷题挺有水分的哈~但好得是真题(同一套的),明天继续!
