REPEAT程序(10分)
附件 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 的值是多少?
------------
思路:
数字变化取决于循环次数和相加的数之积,分别用r[],a[]。
每获取一行输入,先判断他所在的循环层数,也就是判断前面的空格数
如果这行是repeat,那么本层数字为这一层循环的重复次数,因为是嵌套循环,要乘以上一层重复次数才是本层总共的重复次数
如果不是,那么本层数字为A的加数,a[now]+=加数
最后逐行a[i],r[i]相乘再相加得结果
#include <bits/stdc++.h>
#include <iostream>
#include <math.h>
#include <stdlib.h>
#include <cstring>
#include <stdio.h>
#include <queue>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <string>
#define MAX 110
#define INF 0x3f3f3f3f
#define EXP 1e-9
#define DEUBG 0
#define MOD 1000000007
using namespace std;
typedef long long ll;
int n,m,t,k;
int tonum(string s,int p){
int r=0;
while(s[p]>='0'&&s[p]<='9'&&p<s.length()){
r=r*10+s[p]-'0';
p++;
}
return r;
}
int getceng(string s){
int i=0;
for(;s[i]==' ';i++){
}
return i/4;
}
int findnum(string s){
int i=0;
for(;s[i]<'0'||s[i]>'9';i++){
}
return i;
}
int main(){
string s;
int a[MAX];
memset(a,0,sizeof(a));
int r[MAX];
r[0]=1;
int now=0;
int mx=-1;
while(getline(cin,s)){
if(s[0]=='r')break;
cout<<s<<"++"<<endl;
now=getceng(s);
t=s.find("REPEAT");
if(now>mx)mx=now;
if(t!=s.npos){
r[now+1]=r[now]*tonum(s,t+7);
}
else {
t=findnum(s);
a[now]+=tonum(s,t);
// printf("now:%d %d %c\n",now,tonum(s,t),s[t]);
}
}
int ans=0;
for(int i=0;i<=mx;i++){
// printf("%d %d\n",a[i],r[i]);
ans+=a[i]*r[i];
}
printf("%d\n",ans);
return 0;
}