第一步:点赞,没关注的可右上角先关注

请君莫言工作忙,请君莫说接送难。年少爱学直需学,莫待年长空息叹。大家好,我就是文科与理科并重,擅长英语启蒙但却说着一口塑料普通话的思源爸爸。
信息学奥赛中的程序阅读题
随着华杯赛等小学奥数比赛的没落,信息学奥赛逐渐崭露头角,成了小学生的新宠。以湖南省为例,普及组前年初赛分数线是22分,去年就涨到了37分,大约提高了1倍。估计今年就更加火爆了,思源爸爸预计初赛分数线会再次上涨到45分左右。去年80多个小学生通过初赛,复赛获奖的有77个。这些获奖者,即使是三等奖,其简历都备受一些初中学校青睐。
信息学竞赛中其中藏着很多的套路,了解了这些套路,解题就可以势如破竹,考出好成绩。今天我们就一起来分析这些套路。
题目:NOIP2009第十五届普及组初赛题目C++ 阅读程序写结果第2小题
#include <iostream>using namespace std;int main(){int a[3],b[3];int i,j,tmp;for (i=0;i<3;i++)cin >> b[i];for (i=0;i<3;i++){a[i]=0;for (j=0;j<=i;j++){a[i]+=b[j];b[a[i]%3]+=a[j];}}tmp=1;for (i=0;i<3;i++){a[i]%=10;b[i]%=10;tmp*=a[i]+b[i];}cout << tmp << endl;return 0;}•输入:2 3 5•输出:_______
这个题目中,由于有数组+循环,显得特别的困难,其实不然,要做出“数组+循环”的程序阅读题有上中下三策:
上策:推测出其算法中策:画出其计算流程下策:根据程序计算数组内容
一般来讲,上策最简单也最容易做题,但是需要很深厚的计算机知识,所以一般人只能望而兴叹。而下策有又最复杂,一般人根本没有耐心做下去。于是中策就成了解题的常规性操作。
第一步:找到关键代码。
观察程序,如下图所示,框中的代码是一重循环,已经是对处理好的数组进行简单的操作后进行显示了,所以这一部分代码并非关键代码,无需重点考虑。反而是其前面的双重循环才是重中之重。
第二步:初值判断。
如下图可以看出,虽然是双层循环,但是数组a中元素的初始值都是在第一重循环中赋予的,所以根据题目中的输入,写出数组a和b的取值,写出循环控制变量i和j的值。
第三步:第一次循环
外循环第1次,内循环第1次,此时i=0;j=0;那么
a[i] = a[i] + b[j];相当于a[0] = a[0] + b[0] = 0 + 2 = 2;
如下图所示,把b[0]的值加到a[0]上去。
然后下一步为:b[a[i]%3]+=a[j];
我们又:a[i]%3 = 2。所以语句就成了:b[2] = b[2] + a[0] = 5 + 2 = 7;
如下图所示,其图像意义就是把a[0]的值加到b[2]上去。
第四步:外循环第2次,内循环第1次
接下来,内层循环结束,i=1,重新循环,赋值a[1]为0;内层再次第1次循环,j=0;
此时执行:a[i] = a[i] + b[j];就相当于a[1] = a[1] + b[0] = 0 + 2 = 2;图像意义就是把b[0]的值加到a[1]上面去。如下图所示。
接着程序执行:b[a[i]%3]+=a[j];
由于a[i]%3 = 2%3=2,所以上述代码其实就是b[2] = b[2] + a[0] = 7 + 2 = 9;
物理意义为把a[0]的取值加到b[2]上面,如下图所示:
第五步:外循环第2次,内循环第2次
此时i=1;j=1;代码a[i] = a[i] + b[j];等价于a[1] = a[1] + b[1] = 2 + 3 = 5;
图像意义就是把a[1]的取值加到a[1]上。如下图所示:
其后有a[i]%3 = 5%3 = 2,所以其后一步等价为:b[2] = b[2] + a[2] = 9 + 5 = 14;图像意义为把a[1]的值加到b[2]上面。如下图所示:
第五步:猜测过程
有了前面的分析,在加上部分代码,基本上可以推测出流程如下图:
第1步:初始值
第2步:把b数组中第【1】个元素的取值加入到a数组第【1】个元素,把a数组中第【1】个元素的取值加到【b[2]】中。(外循环1)
第3步:把b数组中第【1】个元素的取值加入到a数组第【2】个元素,把a数组中第【1】个元素的取值加到【b[2]】中。(外循环2)
第4步:把b数组中第【2】个元素的取值加入到a数组第【2】个元素,把a数组中第【2】个元素的取值加到【b[2]】中。(外循环2)
第5步:把b数组中第【1】个元素的取值加入到a数组第【3】个元素,把a数组中第【1】个元素的取值加到【b[2]】中。(外循环3)
第6步:把b数组中第【2】个元素的取值加入到a数组第【3】个元素,把a数组中第【2】个元素取值加到【b[2]】中。(外循环3)
第6步:把b数组中第【3】个元素的取值加入到a数组第【3】个元素,把a数组中第【3】个元素取值加到【b[2]】中。(外循环3)
第六步:连乘代码
经过前面的分析,已经知道了a和b两个数组的取值,可以进行最后的取值运算
tmp=1;for (i=0;i<3;i++){a[i]%=10;b[i]%=10;tmp*=a[i]+b[i];}
这段代码中,显然是一个自乘计算,“tmp*=XXX",在循环中,类似于这种代码的都是连乘计算,就好像计算:S=1*2*3*4*5*6*7*8*9等等。通过类似于代码:“tmp+=XXX"都是连加计算,就好像计算:S=1+2+3+4+5+6+7+8+9等。这个基本代码框架一定要记牢!
由于:a[0]%10=2,a[1]%10=5,a[2]%10=6,b[0]%10=2,b[1]%10=5,b[2]%10=7,最终答案tmp=416。
好了,今天就到这里。你若喜欢,还请转发、评论、点赞或者收藏。 思源爸爸,一个专注于少儿原版英语和素质教育的头条号,想看更多内容,别忘了点赞、收藏和关注! 如果要联系思源爸爸,直接在今日头条中私信思源爸爸,一起讨论孩子的学习 当然也可以关注思源爸爸的公众号:zyxhpzsy(长按可复制)。或者直接在今日头条中私信思源爸爸,一起讨论孩子的学习


还没有评论,来说两句吧...