蓝桥杯练习题九 - REPEAT 程序(c++)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 蓝桥杯练习题九 - REPEAT 程序(c++)

题目如下


附件 prog.txt 中是一个用某种语言写的程序。附件在本文的末尾。


其中 REPEAT k 表示一个次数为 k 的循环。循环控制的范围由缩进表达,从次行开始连续的缩进比该行多的(前面的空白更长的)为循环包含的内容。

1.png

该片段中从 A = A + 4 所在的行到 A = A + 8 所在的行都在第一行的循环两次中。


REPEAT 6: 所在的行到 A = A + 7 所在的行都在 REPEAT 5: 循环中。


A = A + 5 实际总共的循环次数是 2 × 5 × 6 = 60 次。


请问该程序执行完毕之后,A 的值是多少?


题目给出的 prog.txt 文件: REPEAT程序


题目解析


可能很多同学都没看懂这个题目是干嘛的,我们以图片上的案例为例,写一下代码,给同学们展示下解题过程。

1.png

代码如下:

#include <iostream>
using namespace std;
int main()
{
    int res = 0;
    for (int i = 0; i < 2; i++)
    {
        res += 4;
        for (int j = 0; j < 5; j++)
        {
            for (int p = 0; p < 6; p++)
            {
                res += 5;
            }
            res += 7;
        }
        res += 8;
    }
    res += 9;
    cout << res;
    return 0;
}

有没有觉得图片和代码看起来很像,没错,REPEAT就是重复的意思,我们可以认为是一个for循环,这样是不是就清晰了。


题目最后留给我们的文件,我们是不是也可以按照这种方式来计算呢?答案是肯定的,可是一看,文件中至少也上千行REPEAT的处理,要是按照这里的解法,那不是要人命吗?所以,这里,我们要讲的是另一种解法,以算法的思维来解题,这也是蓝桥杯想要带给我们的东西,凡事不能蛮干,要动脑筋,我们国家发展到如今的地步,靠的绝对不是蛮干,而是一辈辈先烈们舍小家为大家的中国心和为人民谋未来的圣人之心。


扯远了些,主要就是给大家传达一个理念,做事不能蛮干,要开动脑筋,积极思考。


解题思路分析

1.png

式子 A = A + 4 A = A + 5 A = A + 7 A = A + 8 A = A + 9
循环次数 2 2 * 5 * 6 2 * 5 2 1

有这么一个列表,大家来看下,看博主写的对不对,咱们对照上图来看。


最后我们发现:

sum = 2 * 4 + 2 * 5 * 6 * 5 + 2 * 5 * 7 + 2 * 8 + 1 * 9 = 403


发现规律没小伙伴们,重复几次,是不是一直再加A=A+x里面的x,所以总和就是每一项的循环次数分别乘以这个被加的x。


到这里,大前提已经建立了,这时候,我们就可以开始写代码了,废话不多说,先上代码:

#include <iostream>
using namespace std;
int main(){
  //打开并读取文件 
  FILE *fp = NULL;
  //存放文件地址,替换成自己电脑上的用户名即可,博主是Mac,所以是 这样的地址,windows需要加上分区
  char src[]="/Users/xxxxxxx/Desktop/prog.txt"; 
  //得到文件指针
  fp = fopen(src, "r");
  int fact[10]; //fact:每层存储的倍数,最高十层 
  char buff[255]; //buff:存储每行的临时变量 
  int now = 0;  //now:表示当前循环层级
  int sum = 0;  //sum:统计最终结果 
  //初始化 sum,跳过 
  fgets(buff, 255, fp);
  //循环读取文件每一行  
  while(fgets(buff, 255, fp))
  {
    int p=0;
    //读取空格数得到循环层数 
    while(buff[p]==' ') 
      p++;
    //4个空格为一层循环
    now = p/4; 
    //该行格式:REPEAT *:
    //确定第now层的倍数 
    if(buff[p]=='R')
      fact[now] = (buff[p+7]-'0'); 
    //该行格式:A = A + x 
    //计算该行带来的最终结果 
    if(buff[p]=='A')
    {
      //times存储累计倍数,默认为1
      int times=1, x=buff[p+8]-'0';
      //累计倍数 
      for(int i=0; i<now; i++)  
        times = times*fact[i];
      //和
      sum = sum+times*x;
    } 
  } 
  cout<<sum; 
  return 0;
} 

代码解析


1.文件读取

  //打开并读取文件 
  FILE *fp = NULL;
  //存放文件地址,替换成自己电脑上的用户名即可,博主是Mac,所以是 这样的地址,windows需要加上分区
  char src[]="/Users/xxxxxxx/Desktop/prog.txt"; 
  //得到文件指针
  fp = fopen(src, "r");
  int fact[10]; //fact:每层存储的倍数,最高十层 
  char buff[255]; //buff:存储每行的临时变量 
  int now = 0;  //now:表示当前循环层级
  int sum = 0;  //sum:统计最终结果 
  //初始化 sum,跳过 
  fgets(buff, 255, fp);

代码比较固定,通过FILE来读取即可,这里博主就是说的天花乱坠也说不出个所以然了,没什么太大难度,代码都是固定式,注释也说的很明白,需要注意的是,里面定义的几个变量,比较多,后面用起来不要搞乱了。


2.计算并存储某一层的倍数

    int p=0;
    //读取空格数得到循环层数 
    while(buff[p]==' ') 
      p++;
    //4个空格为一层循环
    now = p/4; 
    //该行格式:REPEAT *:
    //确定第now层的倍数 
    if(buff[p]=='R')
      fact[now] = (buff[p+7]-'0'); 

从文件中内容的格式,我们知道,4个空格为一层:


REPEAT 2:


        A = A + 4


那就好办了, 通过p++获取开头的空格数,再除以4我们就知道是层数,层数的意义是同样的层,循环次数相等,我们存储下这一层需要循环的次数,fact[now] = (buff[p+7]-'0'); now是层数,buff[p+7]刚好是需要加的那个x,说说减去‘0’的意思:


其作用是以‘0’作为基准计算。这里是将字符型x,通过-‘0’,转化为数字x。


这里我们区分下一个概念,循环次数和倍数,循环次数是REPEAT的数值,倍数是x。


3.累计倍数和sum


sum = sum+times*x;


接着我们来计算倍数,当buff[p]='A'时,那么倍数x就是buff[p+8]-'0'。


我们要知道,我们当前在第几层,累计倍数(即循环层数*倍数)就是这一层外面的所有循环次数的乘积再乘以倍数,所以才有了下面的for循环。


还有一个情况,层数刚开始增加,后面会慢慢出去,也就是层数减少:

1.png

这个图说明了这种情况,当倍数为7,8,9的时候就开始减少层数,这时候,循环数也是随着层数减少的,也就是说,当前层的循环次数由当前层之外的所有层数决定。


所以这一层的sum就是:


sum = sum+times*x;


这是一种一层层解析的方式,而这种层级提供了一种互不侵扰的关系,使得我们可以在每一层来计算这一层的sum,才有了这种解题思路。


总结


对于不经常接触算法的同学来说,这题很难,思维决定了难度的高低,我们要做的就是打开思路,从细微处寻找规律。以上,就是这道题目的全部解析,欢迎同学们评论区留言讨论。  

目录
相关文章
|
1月前
|
算法 测试技术 C++
【动态规划算法】蓝桥杯填充问题(C/C++)
【动态规划算法】蓝桥杯填充问题(C/C++)
|
1月前
|
人工智能 算法 BI
第十四届蓝桥杯省赛大学C组(C/C++)三国游戏
第十四届蓝桥杯省赛大学C组(C/C++)三国游戏
|
1月前
|
人工智能 C++
第十四届蓝桥杯省赛大学B组(C/C++)整数删除
第十四届蓝桥杯省赛大学B组(C/C++)整数删除
|
3月前
|
C++
C++ 根据程序运行的时间和cpu频率来计算在另外的cpu上运行所花的时间
C++ 根据程序运行的时间和cpu频率来计算在另外的cpu上运行所花的时间
43 0
|
1月前
|
存储 程序员 编译器
简述 C、C++程序编译的内存分配情况
在C和C++程序编译过程中,内存被划分为几个区域进行分配:代码区存储常量和执行指令;全局/静态变量区存放全局变量及静态变量;栈区管理函数参数、局部变量等;堆区则用于动态分配内存,由程序员控制释放,共同支撑着程序运行时的数据存储与处理需求。
99 21
|
1月前
|
机器学习/深度学习 算法 关系型数据库
第十五届蓝桥杯C++B组省赛
第十五届蓝桥杯C++B组省赛
63 14
|
29天前
|
算法 C++
2022年第十三届蓝桥杯大赛C/C++语言B组省赛题解
2022年第十三届蓝桥杯大赛C/C++语言B组省赛题解
28 5
|
2月前
|
C++
【C++基础】程序流程结构详解
这篇文章详细介绍了C++中程序流程的三种基本结构:顺序结构、选择结构和循环结构,包括if语句、三目运算符、switch语句、while循环、do…while循环、for循环以及跳转语句break、continue和goto的使用和示例。
44 2
|
3月前
|
PHP C++ Python
右手坐标系,空间点绕轴旋转公式&程序(Python和C++程序)
右手坐标系,空间点绕轴旋转公式&程序(Python和C++程序)
62 0
|
3月前
|
C++
c++学习笔记03 程序流程结构
C++学习笔记,主要介绍了程序流程结构,包括顺序结构、选择结构和循环结构。选择结构中详细解释了if语句、三目运算符和switch语句的用法和注意事项。循环结构部分则涵盖了while循环、do-while循环和for循环的语法和使用技巧。此外,还介绍了跳转语句,包括break、continue和goto语句的用途和用法。
35 0