第十一届蓝桥杯 D 题——REPEAT程序(文件数据读取与处理)

2023-10-29

前言:蓝桥杯不时会考察对文件的读取和处理。
1
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;
} 

总结

题目体现了一种问题转换的思想。将复杂、难以动手问题转换为简单、可操作的问题真的很具有技巧性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第十一届蓝桥杯 D 题——REPEAT程序(文件数据读取与处理) 的相关文章

随机推荐