蓝桥杯:REPEAT程序‘s 两种解法

题目描述

【问题描述】
附件 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中的文件大致长这样:
在这里插入图片描述
文件中的每一行的缩进都是严格按照Python的代码规则来的,只是是用自然语言表述的,如果能把PEPEAT x 改写成 for i in range(x),那么将修改后的内容直接在Python编辑器中运行即可,不需要再分析伪代码的逻辑,编辑程序。
当然,如果分析清楚了运算的逻辑,也可编写代码完成。
现在下面介绍一下这两种方法:

法一

正如问题描述中所介绍的那样,这是一道运算次数略多的纯加法运算

REPEAT 2:
	A = A + 4
	REPEAT 5:
		REPEAT 6:
			A = A + 5
		A = A + 7
	A = A + 8
A = A + 9

由于A=A+5被嵌套在三次循环当中,这里的A=A+5其实表示2×5×6个5相加,因而对于每次A=A+X的运算,我们需要弄清楚这句话被嵌套在几个REPEAT循环中,而要看REPEAT循环次数,有需要对文档中的REPEAT X:语句进行解析

代码如下:

import re

#看字符串Str中有有多少个缩进,四个连续的空格'    '代表一个缩进
def get_indent(Str):
    spaceL=re.findall(r'    ',Str) 
    now_indent=len(spaceL)
    return now_indent

def main():
    path = 'prog.txt'
    with open(path,'r') as f:
        contentList = f.readlines() #将prog.txt中的数读入contentList列表中
        f.close()
    
    i=1  #i表示contenList列表的下标,遍历时跳过第一行A=0
    A=0
    multiplier=1
    indent=0
    multiplier_list=[]
    while(i<len(contentList)):
        Str=contentList[i]
        now_indent=get_indent(Str)
        if now_indent<indent:
            multiplier/=multiplier_list[-1]
            multiplier_list.pop() #将列表中最后一个元素弹出      
        if 'REPEAT' in Str:
            times=int(Str[-3]) #注意:Str最后一个字符是换行符'\n'
            multiplier*=times
            multiplier_list.append(times)           
        if 'A = A' in Str:
            addend=int(Str[-2])  #注意:Str最后一个字符是换行符'\n'
            A+=multiplier*addend
            
        i+=1
        indent=now_indent
    print(A)
    
main()

这里的代码参考了亓官劼的这篇文章,我在此基础上对程序作了改进,程序执行的语句应该要更少

法二

由于txt中的伪代码与Python近似,只REPEAT X: 这一句是Python所不能理解的,将其改为Python可理解 for i in range(x):语句即可
代码有1001行,手动改比较费时,可写一个简单Python程序进行更改

代码如下:

path='prog.txt'  #原文本文档
newfile="newprog.txt"  #修改后的文本文档
with open(path,'r') as f,open(newfile,'w') as w:
    content=f.readlines()
    for item in content:
        if 'REPEAT' in item:   #修改REPEAT所在行的语句
            Range='range('+item[item.find(':')-1]+')'
            item=item.replace(item[item.find(':')-1],Range)
            item=item.replace('REPEAT','for i in ')
        w.write(item)
    
    f.close()
    w.close()

运行程序,将生成的newprog.txt文档中的内容copy到.py文件中运行即可,如下图;
在这里插入图片描述

两种方法得出的答案均为 241830

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值