蓝桥杯 REPEAT程序

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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值