代码改变世界

2025_11_7_刷题 - 实践

2026-01-29 13:40  tlnshuju  阅读(0)  评论(0)    收藏  举报

2025_11_7_刷题

一、前言

今天是刷题的第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 总结

本题还好。

三、小结

今日份刷题挺有水分的哈~但好得是真题(同一套的),明天继续!