内容正文:
阅读程序 入门篇
阅读程序
一.题型介绍
阅读程序是各年NOIP初赛第四大题,为读程序写结果(即根据程序或输入写出输出)。此题是整张试卷分值最大的题目,有4小题,每小题8分,总共32分。 我们务必以认真严谨的态度对待。
此题目的在于考察我们的数学运算能力,对程序的理解能力及编程基础理论知识。一般为两道基础难度的题和两道普及难度的题。
一般,此题会考察顺序,选择,循环等结构,数组的灵活运用,字符串的处理,函数的定义及调用和其他各种算法(递归,递推,高精度计算,数据排序,穷举,贪心,深搜,宽搜和动态规划等)[红色的为多次考过的重点题型]。所以,这是一种综合性的题。
阅读程序
二.解题思路及解题方法
看到题目,你可能直接将数据代入源程序来计算,并会得出正确的答案,但是这样思路就很模糊,不能完全理解程序。
解决这类问题的关键,在于能够分析程序的结构以及程序段的功能,读懂编程语言。我总结出解决此类题目的一般步骤:
(1) 从头到尾通读程序,大致抓住程序的算法及其核心(即这个程序的目的),这样可以容易地得出答案,还能给自己增加信心;
(2) 通过给程序分段(找出其输入输出及处理部分)、理清程序的结构和层次,达到读懂程序的目的;
(3)阅读程序中特别注意跟踪主要变量的值的变化,可以用列表的方法,了解变量变化和程序的运行结果,发现规律。
(4)按照程序中输出格式的要求,仔细写出运行结果;
(5)非常重要的一点!!![带着结果回到程序进行快速检查。]
阅读程序
一般利于解题的方法有:
(1)计算法:对于一些简单的问题,直接手动计算;
(2)列表法:将各变量名作为表头,在程序的执行过程中,将各变量值的变化记录在相应变量的下方,从而得出答案的值,快速解决问题。
(3)列图法:解决有关栈,队列,树或图等问题时,可以在纸上将其画出,自己手动模拟过程即可;
(4)找规律法:对于一些递归或递推题,可以列举一些小数据得出结果,再联系数与数之间的关系得出规律(即递归或递推关系式);
(5)举例法:对于像数据排序这类题型,可以先举几个小数据,模拟其排序过程,仔细研究从而能理解代码的含义;
............
阅读程序
三.各题型分析
1.书P90 第1题
程序输入输出非常简单
处理:maxx=a[1];s=a[1];
for(int i=2;i<=10;++i)//循环
{
if(s<0) s=0;//联系上下可知,去掉s<0的数列的和的值,并让其值为0
s=s+a[i];
if(s>maxx) maxx=s;//保留最大的连续序列和
}
根据阅读,不难知道这是一个简单的利用累加算法求最大的连续序列和的问题,所以,可以直接计算或找出输入中的最大连续数列和。
阅读程序
2.书P90 第2题
本题为函数题,需要明白函数的作用。
分析:
已知n=10;
int co(int i1)
{
int j1,s1;
s1=n;//即s1=10;
for(int j1=n-1;j1>=n-i1+1;--j1)
s1=(s1*j1)/(n-j1+1);
return s1;
}
主函数
int s=n+1;//即s=11;
for(int i=2;i<=n;++i) s=s+co(i);
观察co函数的作用:
举一个具体数值代入其中,使复杂程序简单化:
co(5)=(10*9*8*7*6)/2/3/4/5
=(10*9*8*7*6)/(2*3*4*5)
=10!/(5!*5!)
所以,co(i)=10!/(i!*(10-i)!)
=c(10,i)即=从10个数中选出i个数的所有组合的个数。
所以,循环计算,s=11+c(10,j)的值
[ j为2~10].
即:c(10,0)+c(10,1)+…+c(10,10)=210
阅读程序
3.书P91 第3题
此题为递归函数题
因为递归需要递和归两步,所以我们可以直接由边界来递推求解
求fun(9)
inline int fun(int x)
{
if(x==0||x==1) return 3;
else return x-fun(x-2);
}
fun(0)= fun(1)=3; fun(6)=6-fun(6-2)=1;
fun(2)=2-fun(2-2)=-1; fun(7)=7-fun(7-2)=2;
fun(3)=3-fun(3-2)=0; fun(8)=8-fun(8-2)=7;
fun(4)=4-fun(4-2)=5; fun(9)=