NOIP普及组初赛历年试题及答案阅读题篇

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

NOIP普及组初赛历年试题及答案阅读题篇阅读程序写结果(共4题,每题8分,共计32分)阅读程序题是得分的关键,因为不是让你上机去运行程序,所以要一步步地读程序,记录相关变量值的变化情况。因为程序的运行结果只有输出语句才有输出,所以只写出输出语句的结果。有时要找出规律才能写出结果,特别是循环次数多的情况,另外要注意边界值,不能多算一步也不能少算一步。解决这类问题的关键在于能够分析程序的结构以及程序段的功能。常见的有列表法、画流程图法等。完成这类题目的方法和步骤如下:1、从头到尾通读程序,大致把握程序的算法、找出这个题目的即这个程序想干什么。抓住了它,不仅得出答案变得较容易,而且对自己的结果也会比较有信心。2、通过给程序分段、理清程序的结构和层次,达到读懂程序的目的。3、阅读程序中特别注意跟踪主要变量的值的变化,可以用列表的方法,了解变量变化和程序的运行结果,注意发现规律。所谓列表法,就是将各变量名作为表头,在程序的执行过程中,将各变量值的变化记录在相应变量的下方。4、按照程序中输出格式的要求,写出运行结果,并带着结果回到程序进行检查。在阅读程序时,要特别注意过程、函数所完成的子任务以及和主程序之间的参数传递关系。在阅读程序中,比较好的方法是首先阅读主程序,看其需要调用的过程或函数是什么,最后要求输出变量是什么;其次在阅读程序中,将较长的程序分成几个程序段(特别注意循环结构、判断结构),阅读理解各程序段的功能以及各程序之间的关联。NOIP2011-1.#includeiostreamusingnamespacestd;intmain(){inti,n,m,ans;cinnm;i=n;ans=0;while(i=m){//从i=10~20,共循环计数11次ans+=i;//每次循环,ans累加一次i值i++;}coutansendl;//此时ans值应为(10+20)*11/2,即165return0;}输入:1020输出:165NOIP2011-2.#includeiostream#includestringusingnamespacestd;intmain(){stringmap=2223334445556667778889999;//数组中元素位置是从0开始计数的stringtel;inti;cintel;for(i=0;itel.length();i++)if((tel[i]='0')&&(tel[i]='9'))//如果输入的tel是0~9,直接输出tel值couttel[i];elseif((tel[i]='A')&&(tel[i]='Z'))coutmap[tel[i]-'A'];//如果输入的tel是A~Z,则输出一个map数组中对应的元素//输出元素在map数组中位置为“输入字母与A的ASCII码的差值”//如果输入的是其他字符,比如“-”,则不符合循环条件,无输出coutendl;return0;}输入:CCF-NOIP-2011输出:22366472011NOIP2011-3.#includeiostream#includecstringusingnamespacestd;constintSIZE=100;intmain(){intn,i,sum,x,a[SIZE];cinn;memset(a,0,sizeof(a));for(i=1;i=n;i++){cinx;a[x]++;}//循环结束时数组中的值为:a[1]=1,a[2]=2,a[3]=3,a[4]=2,a[5]=1,a[6]=2i=0;sum=0;while(sum(n/2+1)){//当sum值大于等于n/2+1,即sum=6的时候,循环结束i++;sum+=a[i];}coutiendl;//输出循环结束时i的值(不是sum的值)return0;}输入:1145664332321输出:3NOIP2011-4.#includeiostreamusingnamespacestd;intsolve(intn,intm){inti,sum;if(m==1)return1;//递归函数solve(i,m)中m=1时返回函数值为1sum=0;for(i=1;in;i++)//递归函数solve(i,m)中i=1时不循环,sum=0sum+=solve(i,m-1);returnsum;//可递归求得sum=solve(1,3)+(2,3)+(3,3)+(4,3)+(5,3)+(6,3)}intmain(){intn,m;cinnm;coutsolve(n,m)endl;//输出函数值,即sum值return0;}输入:74输出:20NOIP2012-1.#includeiostreamusingnamespacestd;inta,b,c,d,e,ans;intmain(){cinabc;d=a+b;e=b+c;ans=d+e;//ans=a+b+b+ccoutansendl;return0;}输入:125输出:10NOIP2012-2.#includeiostreamusingnamespacestd;intn,i,ans;intmain(){cinn;ans=0;for(i=1;i=n;i++)if(n%i==0)ans++;//统计1~18中18的因数个数coutansendl;return0;}输入:18输出:6NOIP2012-3.#includeiostreamusingnamespacestd;intn,i,j,a[100][100];intsolve(intx,inty){intu,v;if(x==n)returna[x][y];//递归边界:当x=5时,solve(5,y)=a[5][y]u=solve(x+1,y);v=solve(x+1,y+1);if(uv)returna[x][y]+u;elsereturna[x][y]+v;//用递归最终求得solve(1,1)=a[1][1]+solve(2,2)=2+12=14}intmain(){cinn;for(i=1;i=n;i++)for(j=1;j=i;j++)cina[i][j];coutsolve(1,1)endl;return0;}输入:52-142-1-2-164032-158输出:14NOIP2012-4.#includeiostream#includestringusingnamespacestd;intn,ans,i,j;strings;charget(inti){if(in)returns[i];elsereturns[i-n];//i8时,get(i)返回s[i];i=8时,get(i)返回s[i-8],从第一个开始返回}intmain(){cins;n=s.size();ans=0;for(i=1;i=n-1;i++){for(j=0;j=n-1;j++)if(get(i+j)get(ans+j)){ans=i;break;}elseif(get(i+j)get(ans+j))break;}//此循环执行完毕,ans=7for(j=0;j=n-1;j++)coutget(ans+j);//1,ans+j8,输出s[7+0];2,ans+j=8,输出s[8-8];3,ans+j=9,输出s[9-8]……coutendl;return0;}输入:CBBADADA输出:ACBBADADNOIP2013-1.#includeiostreamusingnamespacestd;intmain(){inta,b;cinab;couta+b=a+bendl;return0;}//输出:3+5=8输入:35输出:3+5=8NOIP2013-2.#includeiostreamusingnamespacestd;intmain(){inta,b,u,i,num;cinabu;num=0;for(i=a;i=b;i++)if((i%u)==0)num++;//1-100之间有多少数是15的倍数coutnumendl;return0;}输入:110015输出:6NOIP2013-3.#includeiostreamusingnamespacestd;intmain(){constintSIZE=100;intn,f,i,left,right,middle,a[SIZE];cinnf;for(i=1;i=n;i++)cina[i];left=1;right=n;do{middle=(left+right)/2;if(f=a[middle])right=middle;elseleft=middle+1;}while(leftright);//middle=6,17a[6],则left=7//middle=9,17a[9],则right=9//middle=8,17a[8],则right=8//middle=7,17=a[7],则right=7//left=right,直接输出leftcoutleftendl;return0;}输入:121724691115171819202125输出:7NOIP2013-4.#includeiostreamusingnamespacestd;intmain(){constintSIZE=100;intheight[SIZE],num[SIZE],n,ans;cinn;for(inti=0;in;i++){cinheight[i];num[i]=1;for(intj=0;ji;j++){if((height[j]height[i])&&(num[j]=num[i]))num[i]=num[j]+1;}}//两两相比,得出num[0],num[1],num[2],num[3],num[4],num[5]ans=0;for(inti=0;in;i++){if(num[i]ans)ans=num[i];}//得出num中最大值,即在数组height中第几位数值最大coutansendl;return0;}输入:625311124输出:4不懂算法?跟踪变量!列表模拟!遇到递归?画树形图!注意边界!找到规律了?还会流程图?恭喜你,32分到手了!NOIP2014-1.#includeiostreamusingnamespacestd;intmain(){inta,b,c,d,ans;cinabc;d=a-b;//将a-b=-1赋值给da=d+c;//将d+c=3赋值给aans=a*b;//ans=a*b=3*3=9coutAns=ansendl;return0;}输入:234输出:Ans=9NOIP2014-2.#includeiostreamusingnamespacestd;intfun(intn){if(n==1)return1;//边界fun(1)=1if(n==2)return2;//边界fun(2)=2returnfun(n-2)-fun(n-1);}//fun(n)=fun(n-2)-fun(n-1)intmain(){intn;cinn;coutfun(n)endl;//fun(7)=fun(5)-fun(6)=-11return0;}输入:7输出:-11NOIP2014-3.#includeiostream#includestringusingnamespacestd;intmain(){stringst;inti,len;getline(cin,st);len=st.size();for(i=0;ilen;i++){if(st[i]='a'&&

1 / 28
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功