题目如下

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

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

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

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

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

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

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

题目解析

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

代码如下:

#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的处理,要是按照这里的解法,那不是要人命吗?所以,这里,我们要讲的是另一种解法,以算法的思维来解题,这也是蓝桥杯想要带给我们的东西,凡事不能蛮干,要动脑筋,我们国家发展到如今的地步,靠的绝对不是蛮干,而是一辈辈先烈们舍小家为大家的中国心和为人民谋未来的圣人之心。

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

解题思路分析

式子 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存储累计倍数,默认为1int 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循环。

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

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

所以这一层的sum就是:

sum = sum+times*x;

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


总结

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

蓝桥杯练习题九 - REPEAT 程序(c++)相关推荐

  1. 蓝桥杯练习题Java实现 入门训练 Fibonacci数列

    蓝桥杯练习题Java实现 入门训练 Fibonacci数列 问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,F ...

  2. 蓝桥杯练习题 回文数

    蓝桥杯练习题 回文数 问题描述 1221是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数. 输出格式 按从小到大的顺序输出满足条件的四位十进制数. #include< ...

  3. 第八届蓝桥杯单片机省赛----程序题

    main.c程序 #include<stc15f2k60s2.h> #include "ds18b20.h" #include <ds1302.h>#def ...

  4. Java 01背包【动态规划·蓝桥杯练习题】(相信杨超越,相信锦鲤,默默努力,其它的看天意)

    锦鲤镇楼 1.题目描述: 时间限制:1.0s 内存限制:256.0MB 关键字:01背包 动态规划 问题描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高 ...

  5. 蓝桥杯练习题 Fibonacci数列

    下学期要跟着学校去参加蓝桥杯,所以在这里自己留念之用.(java) 1 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. import java.util.Scann ...

  6. 蓝桥杯单片机(九)DS18B20温度测量(四位小数和负数显示)

    上一次讲了DS18B20的整数温度显示 蓝桥杯单片机(八)DS18B20温度测量(整数显示) 但近几年有出题小数部分的温度显示,首先打开DS18B20的数据手册,如图 通过这张表,我就知道读取数据时, ...

  7. 【c语言】蓝桥杯算法提高 征税程序

    问题描述 税务局希望你帮他们编写一个征税程序,该程序的功能是:首先输入某公司的年销售额sale和税率rate,然后程序将计算出相应的税额tax,并把它显示在屏幕上. 计算公式是: tax = sale ...

  8. 蓝桥杯练习题:对给定整数基于斐波拉契数列构造字符串

    文章目录 一.提出问题 二.解决问题 (一)分析 (二)编程 1.构造[1, n]范围内的斐波拉契数列表 2.基于斐波拉契数列构造字符串函数 3.编写主控程序 4.运行程序,查看结果 三.优化算法 一 ...

  9. 蓝桥杯练习题十四 - 次数差(c++)

    题目如下 问题描述 x星球有26只球队,分别用 a ~ z 的26个字母代表.他们总是不停地比赛. 在某一赛段,哪个球队获胜了,就记录下代表它的字母,这样就形成一个长长的串. 国王总是询问:获胜次数最 ...

最新文章

  1. 开头轰轰烈烈,结局冷冷清清
  2. 分布式系统,session共享方案
  3. 设置项的相互制约关系
  4. 十大被低估的python库_小白必读!十大被低估的Python自带库!
  5. Linux 内核编译 LOCALVERSION 配置(分析内核版本号自动添加的“+“号)
  6. PKU 1087 A Plug for UNIX
  7. 【转】android开发中如何结束所有的activity
  8. 手把手教你安装黑苹果之openCore-0.6.3 EFI制作全过程,非常详细
  9. 安装j2sdk以后,配置环境变量
  10. MATLAB —— 绘制频谱图
  11. Pycharm CPU占用100%
  12. Android Studio 开发实践——简易版音游APP(一)
  13. 线性拟合(回归)的小结
  14. 山东农业大学计算机考研资料汇总
  15. c# autoscroll_禁用Firefox中令人讨厌的AutoScroll功能
  16. Web之一只jio碰到门了
  17. Go语言自学系列 | 高效golang开发
  18. Java第十二周作业
  19. 【xla】五.1、XlaCache命中规则
  20. 魔兽世界官方小说android,魔兽世界官方小说(套装共6册)

热门文章

  1. 计算机一打开就卡在更新失败,win10安装更新系统卡在95%不动了怎么办 两种方法快速解决...
  2. Java编程练习之:水仙花数
  3. Gradle插件上传本地maven库
  4. 全连接条件随机场_【项目案例】北京大兴机场BIM技术应用
  5. Oracle Database 9i, 10g闪回版本查询
  6. Linux 运行python命令
  7. coreldraw 长方体_CorelDRAW示意图绘制技巧(二)
  8. Linux 虚拟机和物理机实现文本复制粘贴
  9. 动手深度学习:08 线性回归(线性回归的从零开始实现)(二)
  10. 第三期 C/C++数据结构 栈的基本操作