C++蓝桥杯青少年组第十二届省赛真题及解析

C++蓝桥杯青少年组第十二届省赛真题及解析

编码文章call10242025-02-10 11:18:1210A+A-

单项选择题

解析:单行注释://

多行注释:/* 注释内容 */

解析:main函数有且只有一个,是 C++ 程序的入口。

解析:int 是关键字。

解析:二进制加法,0 + 0 = 0,1 + 0 = 1,0 + 1 = 1,1 + 1 = 10

解析:int* 是指向int类型的指针,pa[5] 是数组,数组中每一个元素都是一个int型指针。


编程题


解析:循环嵌套判断进行枚举,符合要求的数字直接输出。

  1. #include
  2. using namespace std;
  3. int main(){

  4. int n;
  5. cin >> n;

  6. for(int i = 1; i <= n; i++)
  7. if(i % 7 == 0)
  8. cout << i << ' ';

  9. return 0;
  10. }

解析:变量 x 存储 1、3、6、10……,差值为等差数列,再将变量 x 累加到 s 变量中。

  1. #include
  2. using namespace std;
  3. int main(){

  4. int n;
  5. cin >> n;

  6. int x = 0, s = 0;

  7. for(int i = 1; i <= n; i++){
  8. x += i;
  9. s += x;
  10. }

  11. cout << s;

  12. return 0;
  13. }

解析:本质上是冒泡排序,统计相邻元素交换次数。

  1. #include
  2. using namespace std;

  3. int n;
  4. int a[1010];
  5. int main() {

  6. cin >> n;
  7. for(int i = 1; i <= n; i++) cin >> a[i];

  8. int res = 0;

  9. for(int i = 1; i < n; i++){
  10. for(int j = 1; j < n; j++)
  11. if(a[j] > a[j + 1]){
  12. swap(a[j], a[j + 1]);
  13. res++;
  14. }
  15. }

  16. cout << res;

  17. return 0;
  18. }

解析:日期问题虽然不属于某一种算法,然而,各种算法竞赛中经常考到,模拟起来略有复杂,一般都要设置一个判断闰年的函数,以及一个存储每月最大天数的数组,可以使得编程时更加容易。

因此,平时练习可以将日期问题进行分类。

  1. #include
  2. using namespace std;

  3. bool is_leap(int n){
  4. return (n % 4 == 0 && n % 100) || n % 400 == 0;
  5. }

  6. int n;
  7. int months[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

  8. int y = 1999, m = 4, d = 30;

  9. int main() {

  10. cin >> n;

  11. for(int i = 2; i <= n; i++){
  12. d++;
  13. if(m == 2) months[2] = 28 + is_leap(y);
  14. if(d > months[m]){
  15. d = 1;
  16. if(m == 12){
  17. m = 1;
  18. y++;
  19. }
  20. else m++;
  21. }
  22. }

  23. printf("%d-%02d-%02d", y, m, d);

  24. return 0;
  25. }

解析:试除法判断质数,然后判断一个数字和其逆序数是否均为质数。

求数字逆序可以利用stirng字符串反转快速实现。

  1. #include
  2. using namespace std;

  3. bool is_prime(int n){
  4. for(int i = 2; i <= n / i; i++)
  5. if(n % i == 0)
  6. return false;
  7. return true;
  8. }

  9. int main() {

  10. int n;
  11. cin >> n;

  12. int res = 0;

  13. for(int i = 2; i <= n; i++){
  14. string s = to_string(i);
  15. reverse(s.begin(), s.end());
  16. int j = stoi(s);
  17. if(is_prime(i) && is_prime(j))
  18. res++;
  19. }

  20. cout << res;

  21. return 0;
  22. }

解析:题干较长,是一道完全二叉树问题,但是求解思路很简单,只需将结点权值按照层序遍历分组求和,第一层1个结点,第二层2个结点,第三层四个结点,以此类推。

不需要考虑最后一层结点没有铺满情况,因为是全局数组,默认值为0,没有结点和累加0的作用是一样的。

  1. #include
  2. using namespace std;

  3. int n;
  4. int a[210];

  5. int main() {

  6. cin >> n;
  7. for(int i = 1; i <= n; i++) cin >> a[i];

  8. int maxv = -1, idx = 0, level = 0;

  9. for(int i = 1; ; i++){
  10. int sum = 0;
  11. for(int j = 1; j <= (1 << (i - 1)); j++)
  12. sum += a[++idx];


  13. if(sum > maxv){
  14. maxv = sum;
  15. level = i;
  16. }

  17. if(idx > n) {
  18. cout << level;
  19. return 0;
  20. }
  21. }

  22. return 0;
  23. }


点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4