问题描述
附件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“所在的行都在第一行中循环两次。
从“REPEAT6:”所在的行到”A=A+7“所在的行都在”REPEAT 5:“中循环。
”A=A+5“实际执行的次数是2x5x6=60次。
请问该程序执行完后A的值是多少?
参考答案
241830
解析
该程序是典型的程序模拟题目,但这个模拟比较复杂,下面首先看一下如何手算本题,
计算过程如下:
2x[4+5x(6x5+7)+8]+9
=2x4+2x5x6x5+2x5x7+2x8+9
=403
这里关键是看式子2x4+2x5x6x5+2x5x7+2x8+9。
该式子一共有五项,每项均由以下两部分组成。
(1)循环次数
循环次数分别是2、2x5x6、2x5、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 main()
{
int space=0;
int cnum=1;
int ans=0;
level[0]=-1,stack[0]=1;
freopen(”prog.txt","r",stdin);
getline(cin,str);
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]==':')
{
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;
}