本文主要是介绍C/C++蓝桥杯之REPEAT程序(较难),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
问题描述:
附件prog.txt中是一个用某种语言编写的程序。
其中REPEAT k 表示一个次数为k的循环。循环控制的范围通过缩进表达,从次行开始连续的缩进比该行多的(前面空白更长的)为循环包含的内容。
例如:
REPEAT 2;
A=A+4
REPEAT 5:
REPEAT 6:
A=A+5
A=A+7
A=A+8
A=A+9
该片段中,从“A=A+4”所在的行到“A=A+8”所在的行都在第一行中循环两次。
从“REPEAT 6:”所在的行到“A=A+7”所在的行都在“REPEAT 5:”中循环。
“A=A+5”实际的循环次数是2*5*6=60次。
请问该程序执行完后A的值是多少?
答案:241830
分析:
该程序是典型的程序模拟题目,但是此题比较复杂,下面先看一下如何手算本题,计算过程如下:
先看最里面是:6*5+7=37
接着是:5*(6*5+7)+8=193
然后是:4+5*(6*5+7)+8=197
最后是:2*(4+5*(6*5+7)+8)+9=403
这里的关键是看式子:2*4+2*5*6*5+2*5*7+2*8+9
该式子一共有5项,每项均由以下两部分组成。
(1)循环次数
循环次数分别是:2,2*5*6,2*5,2,1。该循环次数的计算可以根据循环的层次决定,即循环控制范围的缩进,缩进越多,层次越多,循环次数就越多;缩进越少,层次越少,循环次数就越少。
通过观察可知,循环次数首先逐渐增多,然后逐渐减少,减少的顺序是逆序方式,这种方式就是栈的特性,所以可以利用栈的形式模拟过程。
循环次数的控制,即该入栈还是出栈是由代码每行的缩进量(缩进的空白字符数)决定的,因此本题也另外建立了一个栈,用来存储每行的空白字符数,和循环次数栈一起计算出入栈的顺序。
(2)数值项
数值项分别是4,5,7,8,9.只有在碰到“A=A+4”这样的语句时,才需要将当前的循环次数乘以数值项,累加到总的结果中即可计算出总的数据。
#include<iostream>
using namespace std;
const int N=100;
string str;
int level[N];//用来存放当前层的空白字符数
int stack[N];//栈用来存放当前层的循环次数
int top=0;//栈顶
int mnain()
{int space=0;//每行前面的空格数int cnum=1;//总循环数int ans=0;//结果level[0]=-1;stack[0]=1;freopen("prong.txt","r",stdin);//从文件中获取输入getline(cin,str);//首行数据A=0处理while(getline(cin,str))//从读第二行开始{int len=str.size();space=0;//每次重新对空格计数while(str[space]==' '){space++;}while(space<=level[top]){cnum/=stack[top--];//出栈,循环次数减少}if(str[len-1]==':')//判断是否是REPEAT语句{int k=str[len-2]-'0';//当前循环重复的次数cnum*=k;top++;//来到新的一层level[top]=space;stack[top]=k;}else//不是循环语句{int k=str[len-1]-'0';//要加上的数ans+=cnum*k;}}cout<<ans<<endl;return 0;
}
此题较难,小伙伴们能看懂就看吧,实在不行别强求!
这篇关于C/C++蓝桥杯之REPEAT程序(较难)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!