前言:蓝桥杯不时会考察对文件的读取和处理。
prog.txt
解题思路
首先,我们将题目中给出的样例拿出来分析。
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 + 5 |
A = A + 7 |
A = A + 8 |
A = A + 9 |
循环次数 |
2 |
2 * 5 * 6 |
2 * 5 |
2 |
1 |
发现:每个式子的循环次数就是外循环的累乘。
eg:
A = A + 4 只在 2 的循环里,总循环次数 2。
A = A + 7 在 2 的循环和 5 的循环里,总循环次数 10。
对于 A = A + x,最终结果: x * 总循环次数
按上面的方法,假设初始化A=0,计算出题目所给的片段的值。
sum = 2 * 4 + 2 * 5 * 6 * 5 + 2 * 5 * 7 + 2 * 8 + 1 * 9 = 403
//常规方法计算片段,结果为 403
#include<stdio.h>
int main()
{
int A=0;
for(int i=0;i<2;i++) {
A=A+4;
for(int j=0;j<5;j++) {
for(int z=0;z<6;z++) {
A=A+5;
}
A=A+7;
}
A=A+8;
}
A=A+9;
printf("%d", A);
return 0;
}
sum = 常规计算结果,验证成功。
问题转换
运行程序 —> 统计每个式子的总循环次数求和
最终设计代码
#include <iostream>
using namespace std;
int main(){
//打开并读取文件
FILE *fp = NULL;
//存放文件地址
char src[]="C:/Users/Administrator/Desktop/prog.txt";
//得到文件指针
fp = fopen(src, "r");
int fact[10]; //fact:每层存储的倍数,最高十层
char buff[255]; //buff:存储每行的临时变量
int now = 0; //now:表示当前循环层级
int sum = 0; //sum:统计最终结果
//初始化 sum,跳过
fgets(buff, 255, fp);
//循环读取文件每一行
while(fgets(buff, 255, fp))
{
int p=0;
//读取空格数得到循环层数
while(buff[p]==' ')
p++;
//4个空格为一层循环
now = p/4;
//该行格式:REPEAT *:
//确定第now层的倍数
if(buff[p]=='R')
fact[now] = (buff[p+7]-'0');
//该行格式:A = A + x
//计算该行带来的最终结果
if(buff[p]=='A')
{
//times:存储累计倍数
int times=1, x=buff[p+8]-'0';
//累计倍数
for(int i=0; i<now; i++)
times = times*fact[i];
//累计结果
sum = sum+times*x;
}
}
cout<<sum;
return 0;
}
总结
题目体现了一种问题转换的思想。将复杂、难以动手问题转换为简单、可操作的问题真的很具有技巧性。