欢迎光临大千小熊的博客,我是一只又会MMD又会C++的正派熊,B站和CSDN同步更新,欢迎关注。
题目背景说明:
这是一道2020年蓝桥杯C/C++程序设计B组·省级比赛的题目。题目难度不高,主要是想法方面的问题。这里小熊想了两种方法,下面一一讲解。
题目描述(试题 D: REPEAT 程序):
附件 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 的值是多少?
提交类型:
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
思路分析:
想法一:
(1)既然这道题目是一道只要答案的题目,那我可不可以这样:我将prog.txt中的语法改成C++中的语法(翻译一遍),然后再直接复制到新的cpp中将答案运算出来,不久可以了吗?
是的,这样没错,让我们来尝试翻译一遍吧:
(1.1)如果我们遇到“REPEAT 2”我们就把它改写成" for (int i1=0;i1<2;i1++) { "
(1.2)如果我们遇到“A=A+1”,我们就把它改写成"A=A+1 ; "
这样就大体上符合C++的语法了。那么现在思考,右边的大括号( } )什么时候出现?
(1.3)根据题目的意思,缩进决定了循环的退出,当当前缩进小于上面一行的时候,就是说退出了循环,那么这个时候就是我们要加上" } "的时机了。
(1.4)由于最后的时候未必出现,下面一行缩进小于上面一行的缩进,比如附件中的情况就会出现不匹配括号的情况,这个时候我们自己添加几个花括号就可以了。
想法二:
(2.1)我们现在来看看到底什么叫做循环。
在小熊看来,其实就是一个数字比如他是30,然后现在循环了10次,那么它就是30*10。

图片1:最简单的模型
那么我们知道,循环是嵌套的,那么实际上上图肚子中的30,很可能也是一个循环计算出来的。比如下面的图片:

图片2:嵌套的循环
所以我们要把(2)号的循环先做一遍,然后得到结果是30,然后最终得到“图片1”的那种状态。
这本质上面就是一个深搜,先把里面的做出来,然后弹出到上一层继续做。

图片3:并列的循环
我们现在来看看图片三,先深搜到(2)然后我们知道答案是30,也就是(1)的循环要加的数是30。
然后深搜到(3),知道答案是8,知道(1)的循环要加的数是30+8。
最后搜索到最底下的9,9本来就是属于第一个层次,所以直接就是30+8+9。
然后(1)第一个层次要求循环10次,所以10*(30+8+9),得到最终的答案。
那么小熊再设计的时候直接开了一个stack,其中Needi是需要循环几次,Sum是每次循环要加多少的值。
参考程序:
第一种想法:
//思路,就是转换一下写法,改成C++的写法,然后让计算机帮我计算。
#include <cstring>#include<iostream>using namespace std;
string str;
int x = 0, Upline = 0, ix = 0;
bool checkM(string str) {
int flages = 0, i;
for (int i = 0; i < str.length(); i++) {
if (str[i] == 'R') {
flages = 1;
}
if (str[i] <= '9' && str[i] >= '0') {
x = int(str[i] - '0'); //把字符串里面的数字记录一下
}
}
return flages;
}
int GetLine(string str) {
int i = 0;
while (str[i] == ' ')
i++;
return i;
}
int main() {
freopen("1.txt", "r", stdin);
freopen("2.txt", "w", stdout);
while (getline(cin, str)) {
int NowLine = GetLine(str);
if (NowLine < Upline)
cout << "}";
if (checkM(str)) { //是循环
cout << "for (int i" << ++ix << "=0; i" << ix << "<" << x << "; i" << ix
<< "++){" << endl;
} else { //是做加减运算
cout << str + ";" << endl;
}
Upline = NowLine;
}
return 0;
}
第二种想法:
#include <iostream>#include<stack>using namespace std;
class A { //一个stack中保存的元素,过程其实就是dfs
public:
int Needi = 0; //循环几次
int Sum = 0; //每次循环要加多少值呢
A(int a, int b) : Needi(a), Sum(b){};//构造函数
};
stack<A> Sa; //开辟一个stack
int OldTab = 0, NowTab = 0; //缩进的比较
string str;
int GetLine() {
int i = 0;
while (str[i] == ' ') i++;
return i;
}
int StringNum = 0;
bool check() { //开始读取字符串的信息,判断状态保存数字
int flages = 0;
for (int i = 0; i < str.length(); i++) {
if (str[i] == 'R') flages = 1;
if (str[i] >= '0' && str[i] <= '9') StringNum = str[i] - '0';
}
return flages; //如果是1的话,说明是循环
}
int main() {
// freopen("1.txt", "r", stdin); //使用文件读入和输出
// freopen("2.txt", "w", stdout);
Sa.push(A(1, 0)); //题目可能没有循环,所以先开辟一个循环1次的状态
while (getline(cin, str)) {
NowTab = GetLine();
if (OldTab > NowTab) {
A temp(Sa.top().Needi, Sa.top().Sum);
Sa.pop(); //因为缩进小于上一行,所以弹出去,然后缓存在了temp
Sa.top().Sum += temp.Needi * temp.Sum;
}
if (check()) {
Sa.push(A(StringNum, 0));
} else {
Sa.top().Sum += StringNum;
}
OldTab = NowTab; //缓存当前的缩进,和下一次做比较。
}
while (Sa.size() > 1) { //没有数据了,但是还有循环没有弹出,手动弹出一下
A temp(Sa.top().Needi, Sa.top().Sum);
Sa.pop();
Sa.top().Sum += temp.Needi * temp.Sum;
}
cout << Sa.top().Sum * Sa.top().Needi;
return 0;
}
附件描述(prog.txt):
A = 0
REPEAT 2:
A = A + 4 REPEAT 5: REPEAT 6: A = A + 5 A = A + 7 REPEAT 6: A = A + 7 REPEAT 4: A = A + 2 A = A + 7 A = A + 2 REPEAT 7: REPEAT 4: A = A + 8 A = A + 7 A = A + 4 A = A + 5 A = A + 8 REPEAT 8: A = A + 5 REPEAT 1: A = A + 2 REPEAT 7: A = A + 5 A = A + 5 REPEAT 2: REPEAT 3: A = A + 1 A = A + 1 REPEAT 5: A = A + 1 REPEAT 9: REPEAT 6: A = A + 5 A = A + 1 REPEAT 6: A = A + 2 A = A + 8 A = A + 3 REPEAT 2: A = A + 5 REPEAT 3: A = A + 9 REPEAT 1: A = A + 4 REPEAT 2: A = A + 9 REPEAT 1: A = A + 6 A = A + 6 A = A + 4 REPEAT 3: A = A + 7 A = A + 1 REPEAT 2: A = A + 3 REPEAT 5: A = A + 2 A = A + 5 A = A + 2 A = A + 4 A = A + 3REPEAT 4:
A = A + 4 A = A + 3 A = A + 7 REPEAT 5: REPEAT 4: A = A + 5 A = A + 7 REPEAT 5: A = A + 3 REPEAT 3: A = A + 3 A = A + 1 A = A + 8 A = A + 2 REPEAT 9: A = A + 5 REPEAT 1: A = A + 5 A = A + 2 A = A + 8A = A + 6
REPEAT 3:
REPEAT 4: A = A + 9 REPEAT 5: A = A + 2 A = A + 1 REPEAT 9: A = A + 9 A = A + 2 REPEAT 1: A = A + 6 A = A + 8 REPEAT 2: A = A + 9 A = A + 4 A = A + 7 REPEAT 2: REPEAT 7: A = A + 3 A = A + 5 REPEAT 3: A = A + 5 A = A + 3 A = A + 6 A = A + 4 REPEAT 9: A = A + 2 A = A + 8 A = A + 2 A = A + 3 REPEAT 2: REPEAT 8: A = A + 5 A = A + 1 A = A + 6 A = A + 1 A = A + 2 REPEAT 6: REPEAT 1: A = A + 3 REPEAT 1: A = A + 2 REPEAT 4: A = A + 7 A = A + 1 A = A + 8 REPEAT 6: A = A + 5 REPEAT 6: A = A + 3 REPEAT 2: A = A + 2 A = A + 9 A = A + 7 REPEAT 9: A = A + 8 REPEAT 9: A = A + 8 A = A + 9 A = A + 3 A = A + 2 REPEAT 6: A = A + 3 REPEAT 9: A = A + 1 A = A + 9 A = A + 5 REPEAT 2: A = A + 4 A = A + 9 A = A + 8 REPEAT 5: A = A + 6 A = A + 9 A = A + 1 REPEAT 1: A = A + 4 A = A + 2 REPEAT 9: REPEAT 3: A = A + 4 REPEAT 7: A = A + 8 A = A + 3 REPEAT 5: A = A + 9 REPEAT 8: A = A + 9 A = A + 8 REPEAT 4: A = A + 7 A = A + 7 A = A + 3A = A + 5
REPEAT 6:
A = A + 7REPEAT 7:
A = A + 2 A = A + 2A = A + 1
REPEAT 8:
REPEAT 1: REPEAT 4: A = A + 6 A = A + 6 A = A + 2 REPEAT 5: A = A + 4 A = A + 8 A = A + 4 REPEAT 1: A = A + 5 REPEAT 7: A = A + 8 REPEAT 6: A = A + 4 A = A + 4 A = A + 8 REPEAT 4: A = A + 2 REPEAT 2: A = A + 4 REPEAT 2: A = A + 3 REPEAT 1: A = A + 2 A = A + 8 REPEAT 2: A = A + 7 REPEAT 8: A = A + 6 A = A + 1 A = A + 7 REPEAT 8: A = A + 2 REPEAT 8: REPEAT 6: A = A + 1 A = A + 6 REPEAT 2: A = A + 4 A = A + 1 A = A + 7 A = A + 4REPEAT 4:
REPEAT 9: A = A + 2 REPEAT 1: A = A + 2 A = A + 5REPEAT 8:
REPEAT 6: A = A + 3 REPEAT 4: A = A + 1 A = A + 6 A = A + 1 REPEAT 7: A = A + 7 REPEAT 7: A = A + 3 A = A + 9 A = A + 1 A = A + 9 REPEAT 3: A = A + 5 A = A + 5 A = A + 6 A = A + 2 REPEAT 1: A = A + 4 REPEAT 2: A = A + 7 REPEAT 1: A = A + 7 REPEAT 4: A = A + 7 A = A + 2 REPEAT 5: A = A + 9 A = A + 1 A = A + 9 A = A + 5 A = A + 9 REPEAT 5: A = A + 5 REPEAT 1: A = A + 6 REPEAT 2: A = A + 3 A = A + 2 A = A + 6 A = A + 8 A = A + 8 A = A + 7 A = A + 5 A = A + 5REPEAT 2:
A = A + 1 A = A + 7A = A + 3
REPEAT 2:
A = A + 7A = A + 1
A = A + 4
REPEAT 1:
REPEAT 7: REPEAT 2: A = A + 3 A = A + 5 A = A + 2 A = A + 6 A = A + 1A = A + 2
A = A + 4
A = A + 9
REPEAT 1:
A = A + 8REPEAT 8:
REPEAT 4: REPEAT 8: A = A + 4 REPEAT 3: A = A + 1 A = A + 8 REPEAT 7: A = A + 8 REPEAT 7: A = A + 7 A = A + 7 REPEAT 7: A = A + 6 REPEAT 5: A = A + 9 A = A + 3 REPEAT 4: A = A + 5 A = A + 5 A = A + 4 REPEAT 9: REPEAT 3: A = A + 4 A = A + 3 A = A + 6 REPEAT 1: A = A + 3 A = A + 3 A = A + 6 REPEAT 6: A = A + 7 A = A + 7 A = A + 5 A = A + 5 A = A + 1 A = A + 2 A = A + 6 A = A + 6 REPEAT 9: A = A + 6 REPEAT 1: REPEAT 2: A = A + 4 A = A + 7 REPEAT 3: A = A + 6 REPEAT 5: A = A + 3 A = A + 6 REPEAT 9: A = A + 3 A = A + 6 REPEAT 5: A = A + 8 A = A + 8 REPEAT 3: A = A + 7 A = A + 9 A = A + 8 A = A + 3 A = A + 3 A = A + 9REPEAT 6:
A = A + 9A = A + 1
REPEAT 4:
REPEAT 1: A = A + 7 REPEAT 9: A = A + 2 A = A + 9 A = A + 1A = A + 2
A = A + 8
A = A + 7
A = A + 9
A = A + 6
REPEAT 4:
REPEAT 2: A = A + 3 REPEAT 3: A = A + 4 A = A + 4REPEAT 6:
A = A + 6A = A + 1
A = A + 5
A = A + 8
REPEAT 2:
A = A + 6 REPEAT 1: REPEAT 2: A = A + 2 REPEAT 3: A = A + 1 REPEAT 1: A = A + 8 A = A + 7 A = A + 4 A = A + 2 A = A + 8 A = A + 4 REPEAT 5: REPEAT 6: A = A + 8 REPEAT 9: A = A + 5 A = A + 5 REPEAT 5: A = A + 5 REPEAT 3: REPEAT 5: A = A + 4 REPEAT 4: A = A + 6 A = A + 3 REPEAT 7: A = A + 3 A = A + 3 A = A + 1 A = A + 7 A = A + 7 A = A + 6 A = A + 5 A = A + 5 A = A + 6 REPEAT 1: A = A + 9 A = A + 3 REPEAT 1: REPEAT 1: A = A + 1 REPEAT 8: A = A + 5 REPEAT 8: A = A + 6 REPEAT 4: A = A + 9 A = A + 4 REPEAT 2: A = A + 3 A = A + 7 REPEAT 5: A = A + 7 A = A + 5 A = A + 8 A = A + 7 A = A + 8 A = A + 5 REPEAT 2: A = A + 5 A = A + 7 A = A + 8A = A + 5
A = A + 9
REPEAT 2:
REPEAT 6: A = A + 9 A = A + 1 A = A + 8 A = A + 7 A = A + 1 A = A + 5 REPEAT 3: A = A + 3 A = A + 9 A = A + 7 REPEAT 3: A = A + 9 A = A + 1 REPEAT 6: A = A + 1 REPEAT 9: REPEAT 7: A = A + 3 REPEAT 5: A = A + 5 A = A + 8 A = A + 8 A = A + 1 A = A + 2 REPEAT 4: A = A + 6 REPEAT 3: A = A + 3 A = A + 7 REPEAT 8: REPEAT 1: A = A + 7 A = A + 8 A = A + 3 A = A + 1A = A + 2
A = A + 4
A = A + 7
REPEAT 1:
REPEAT 1: REPEAT 1: A = A + 4 A = A + 6 REPEAT 1: A = A + 3 A = A + 9 A = A + 6 REPEAT 9: A = A + 1 A = A + 6 REPEAT 5: A = A + 3 A = A + 9 A = A + 5 A = A + 5 A = A + 7 A = A + 2 REPEAT 2: A = A + 7 A = A + 7 REPEAT 7: REPEAT 4: A = A + 6 A = A + 8 REPEAT 6: A = A + 6 REPEAT 2: A = A + 1 A = A + 7 A = A + 6 A = A + 7 REPEAT 4: REPEAT 7: A = A + 1 REPEAT 2: A = A + 2 A = A + 5 A = A + 8 A = A + 2A = A + 1
A = A + 4
REPEAT 8:
A = A + 5A = A + 6
REPEAT 7:
REPEAT 6: REPEAT 9: A = A + 7 A = A + 8 REPEAT 4: A = A + 6 A = A + 4 A = A + 3 A = A + 6 REPEAT 9: A = A + 3 REPEAT 9: A = A + 2 A = A + 7 A = A + 5 A = A + 2REPEAT 7:
REPEAT 8: REPEAT 6: A = A + 4 A = A + 9 A = A + 5 A = A + 3 A = A + 9 REPEAT 4: REPEAT 1: A = A + 6 A = A + 8 REPEAT 1: A = A + 6 A = A + 4 A = A + 6 REPEAT 3: A = A + 7 REPEAT 3: A = A + 4 A = A + 4 A = A + 2 A = A + 3 A = A + 7 REPEAT 5: A = A + 6 A = A + 5 REPEAT 1: REPEAT 8: A = A + 5 REPEAT 3: A = A + 6 REPEAT 9: A = A + 4 A = A + 3 REPEAT 6: REPEAT 2: A = A + 1 A = A + 5 A = A + 2A = A + 2
A = A + 7
REPEAT 4:
A = A + 7A = A + 9
A = A + 2
REPEAT 8:
A = A + 9 REPEAT 9: REPEAT 2: A = A + 3 A = A + 2 A = A + 1 A = A + 5 REPEAT 9: A = A + 1 A = A + 3 A = A + 9 REPEAT 7: A = A + 2 REPEAT 5: A = A + 9 A = A + 3 REPEAT 2: A = A + 4 REPEAT 8: A = A + 9 REPEAT 5: A = A + 5 A = A + 4 A = A + 2 A = A + 4 REPEAT 6: A = A + 2 REPEAT 5: A = A + 7 A = A + 7 A = A + 8 A = A + 3 REPEAT 8: A = A + 2 A = A + 5 REPEAT 1: A = A + 8 A = A + 5 A = A + 1 A = A + 1 A = A + 5 REPEAT 2: A = A + 6 REPEAT 6: A = A + 9 A = A + 2 A = A + 5 REPEAT 4: A = A + 7 A = A + 1 REPEAT 6: A = A + 8 A = A + 4 REPEAT 3: REPEAT 2: A = A + 1 A = A + 5 REPEAT 2: A = A + 7 REPEAT 9: A = A + 6 A = A + 8 A = A + 9 A = A + 5 REPEAT 9: REPEAT 3: A = A + 7 A = A + 7 A = A + 9 A = A + 7 REPEAT 5: A = A + 7 A = A + 2 A = A + 1 A = A + 8 A = A + 3 A = A + 5A = A + 1
REPEAT 8:
A = A + 4A = A + 2
A = A + 2
A = A + 8
REPEAT 4:
REPEAT 4: A = A + 8 REPEAT 7: A = A + 5 A = A + 2 REPEAT 2: A = A + 6 REPEAT 4: A = A + 8 A = A + 6 A = A + 1 A = A + 3A = A + 2
A = A + 7
A = A + 4
REPEAT 8:
A = A + 2 A = A + 4REPEAT 5:
REPEAT 3: REPEAT 6: A = A + 8 A = A + 1 A = A + 6 A = A + 5 A = A + 9REPEAT 8:
A = A + 7REPEAT 6:
A = A + 4A = A + 5
REPEAT 3:
A = A + 1 REPEAT 1: REPEAT 5: A = A + 6 A = A + 2 REPEAT 9: REPEAT 5: A = A + 9 A = A + 3 REPEAT 9: A = A + 9 A = A + 8 REPEAT 8: REPEAT 5: A = A + 9 A = A + 4 REPEAT 9: A = A + 3 A = A + 4 A = A + 5REPEAT 9:
REPEAT 7: A = A + 5 REPEAT 3: A = A + 7 REPEAT 9: REPEAT 6: A = A + 4 A = A + 6 REPEAT 5: REPEAT 6: A = A + 5 A = A + 3 A = A + 3 A = A + 3 A = A + 5 REPEAT 7: A = A + 5 REPEAT 2: A = A + 5 A = A + 6 REPEAT 2: A = A + 2 A = A + 5 A = A + 3A = A + 5
A = A + 5
REPEAT 4:
A = A + 2 A = A + 1 REPEAT 9: A = A + 9 A = A + 5 A = A + 6 A = A + 2 A = A + 2 A = A + 5 REPEAT 9: A = A + 5 A = A + 4 REPEAT 4: REPEAT 4: A = A + 1 A = A + 2 REPEAT 6: A = A + 9 A = A + 3 REPEAT 2: A = A + 5 A = A + 1 A = A + 1 A = A + 3 A = A + 8 REPEAT 7: A = A + 4 REPEAT 6: A = A + 9 REPEAT 5: A = A + 9 A = A + 8 A = A + 3 A = A + 9 A = A + 4 A = A + 6REPEAT 7:
A = A + 9REPEAT 9:
A = A + 4 A = A + 9 A = A + 1 A = A + 3 REPEAT 5: REPEAT 1: A = A + 4 A = A + 4 REPEAT 8: A = A + 9 A = A + 6 A = A + 2 REPEAT 3: A = A + 4 A = A + 4 REPEAT 3: A = A + 5 A = A + 2 A = A + 8 A = A + 3 A = A + 6 A = A + 4 A = A + 9 A = A + 1 A = A + 9 A = A + 5 A = A + 3 REPEAT 3: A = A + 2 A = A + 5 A = A + 8 A = A + 2 A = A + 5 REPEAT 8: REPEAT 2: A = A + 6 A = A + 7 A = A + 6 A = A + 9 A = A + 2REPEAT 2:
A = A + 3 REPEAT 8: A = A + 7 A = A + 2 A = A + 1 A = A + 4 A = A + 1 A = A + 5 A = A + 2 A = A + 1 REPEAT 1: A = A + 1 REPEAT 6: A = A + 4 A = A + 3 A = A + 3 REPEAT 5: A = A + 3 REPEAT 6: REPEAT 1: A = A + 5 A = A + 7 A = A + 7 A = A + 7 REPEAT 5: A = A + 9 A = A + 7 REPEAT 5: A = A + 9 A = A + 1 A = A + 9 A = A + 8 REPEAT 1: A = A + 2 REPEAT 5: A = A + 8 REPEAT 3: A = A + 2 A = A + 9 A = A + 6 A = A + 3 REPEAT 5: REPEAT 6: A = A + 5 A = A + 5 REPEAT 4: A = A + 5 A = A + 4 REPEAT 8: A = A + 9 A = A + 1 REPEAT 8: A = A + 8 A = A + 1 A = A + 4 REPEAT 6: A = A + 6 REPEAT 2: A = A + 3 A = A + 9 A = A + 6 A = A + 9 REPEAT 1: A = A + 4 REPEAT 3: A = A + 3 A = A + 4 A = A + 2 A = A + 8 REPEAT 2: A = A + 4 A = A + 1 REPEAT 9: A = A + 2 A = A + 9 A = A + 7REPEAT 7:
REPEAT 7: REPEAT 5: A = A + 7 REPEAT 5: A = A + 1 A = A + 1 REPEAT 5: A = A + 6 REPEAT 1: A = A + 4 REPEAT 9: A = A + 4 A = A + 1 REPEAT 6: A = A + 8 A = A + 5 REPEAT 1: A = A + 4 REPEAT 5: A = A + 8 A = A + 7 A = A + 2 REPEAT 3: A = A + 3 REPEAT 8: REPEAT 8: A = A + 4 A = A + 7 REPEAT 5: A = A + 1 REPEAT 8: A = A + 7 A = A + 8 A = A + 4 A = A + 7 A = A + 6 A = A + 9 A = A + 5REPEAT 3:
A = A + 5 REPEAT 9: A = A + 1 A = A + 7REPEAT 1:
A = A + 8A = A + 4
REPEAT 8:
REPEAT 7: A = A + 2 REPEAT 4: A = A + 6 A = A + 6 REPEAT 1: A = A + 7 A = A + 1REPEAT 9:
REPEAT 5: A = A + 6 A = A + 5 REPEAT 7: A = A + 3 A = A + 6 A = A + 8 REPEAT 2: A = A + 7 A = A + 1 A = A + 9 REPEAT 3: REPEAT 3: A = A + 5

1767

被折叠的 条评论
为什么被折叠?



