第1~3届蓝桥杯决赛试题及答案

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

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

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

资源描述

2011年暑假蓝桥杯决赛题附答案1.四方定理数论中有著名的四方定理:所有自然数至多只要用四个数的平方和就可以表示。我们可以通过计算机验证其在有限范围的正确性。对于大数,简单的循环嵌套是不适宜的。下面的代码给出了一种分解方案。请仔细阅读,填写空缺的代码(下划线部分)。注意:请把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。直接写在题面中不能得分。intf(intn,inta[],intidx){if(______________)return1;//填空1if(idx==4)return0;for(inti=(int)sqrt(n);i=1;i--){a[idx]=i;if(_______________________)return1;//填空2}return0;}intmain(intargc,char*argv[]){for(;;){intnumber;printf(输入整数(1~10亿):);scanf(%d,&number);inta[]={0,0,0,0};intr=f(number,a,0);printf(%d:%d%d%d%d\n,r,a[0],a[1],a[2],a[3]);}return0;}2.加密在对文本进行简单加密的时候,可以选择用一个n位的二进制数,对原文进行异或运算。解密的方法就是再执行一次同样的操作。加密过程中n位二进制数会循环使用。并且其长度也可能不是8的整数倍。下面的代码演示了如何实现该功能。请仔细阅读,填写空缺的代码(下划线部分)。注意:请把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。直接写在题面中不能得分。voidf(char*buf,unsignedchar*uckey,intn){inti;for(i=0;in;i++)buf[i]=buf[i]^uckey[i];}intmain(intargc,char*argv[]){charp[]=abcd中国人123;//待加密串char*key=11001100010001110;//以串的形式表达的密匙,运算时要转换为按位存储的形式。intnp=strlen(p);intnk=strlen(key);unsignedchar*uckey=(unsignedchar*)malloc(np);//密匙串需要按位的形式循环拼入uckey中inti;for(i=0;inp*8;i++){if(key[i%nk]=='1')____________________________________________;//填空1else____________________________________________;//填空2}f(p,uckey,strlen(p));f(p,uckey,strlen(p));printf(%s\n,p);free(uckey);return0;}3.公倍数为什么1小时有60分钟,而不是100分钟呢?这是历史上的习惯导致。但也并非纯粹的偶然:60是个优秀的数字,它的因子比较多。事实上,它是1至6的每个数字的倍数。即1,2,3,4,5,6都是可以除尽60。我们希望寻找到能除尽1至n的的每个数字的最小整数。不要小看这个数字,它可能十分大,比如n=100,则该数为:69720375229712477164533808935312303556800请编写程序,实现对用户输入的n(n100)求出1~n的最小公倍数。例如:用户输入:6程序输出:60用户输入:10程序输出:2520要求考生把所有函数写在一个文件中。调试好后,存入与考生文件夹下对应题号的“解答.txt”中即可。相关的工程文件不要拷入。对于编程题目,要求选手给出的解答完全符合ANSIC标准,不能使用c++特性;不能使用诸如绘图、中断调用等硬件相关或操作系统相关的API。4.地铁换乘为解决交通难题,某城市修建了若干条交错的地铁线路,线路名及其所属站名如stations.txt所示。线1苹果园....四惠东线2西直门车公庄....建国门线4....其中第一行数据为地铁线名,接下来是该线的站名。当遇到空行时,本线路站名结束。下一行开始又是一条新线....直到数据结束。如果多条线拥有同一个站名,表明:这些线间可以在该站换车。为引导旅客合理利用线路资源,解决交通瓶颈问题,该城市制定了票价策略:1.每条线路可以单独购票,票价不等。2.允许购买某些两条可换乘的线路的联票。联票价格低于分别购票。单线票价和联合票价如price.txt所示。线1180.....线13114线1,线2350线1,线10390.....每行数据表示一种票价线名与票价间用空格分开。如果是联票,线名间用逗号分开。联票只能包含两条可换乘的线路。现在的问题是:根据这些已知的数据,计算从A站到B站最小花费和可行的换乘方案。比如,对于本题目给出的示例数据如果用户输入:五棵松,奥体中心程序应该输出:-(线1,线10)-线8=565如果用户输入:五棵松,霍营程序应该输出:-线1-(线4,线13)=440可以看出,用户输入的数据是:起始站,终到站,用逗号分开。程序输出了购票方案,在括号中的表示联票,短横线(-)用来分开乘车次序。等号后输出的是该方案的花费数值。请编程解决上述问题。注意:1.我们测试您的程序时,所用数据与题目中的示例数据不同,但格式完全一样。2.当多个方案有相同的最小花费,输出任意一个方案即可。要求考生把所有函数写在一个文件中。调试好后,存入与考生文件夹下对应题号的“解答.txt”中即可。相关的工程文件不要拷入。对于编程题目,要求选手给出的解答完全符合ANSIC标准,不能使用c++特性;不能使用诸如绘图、中断调用等硬件相关或操作系统相关的API。文件price.txt内容如下:线1180线2250线4160线5270线8175线10226线13114线1,线2350线1,线10390线1,线5410线1,线4330线10,线13310线2,线5390线4,线10370线4,线13260文件station.txt内容如下:线1苹果园古城路八角游乐园八宝山玉泉路五棵松万寿路公主坟军事博物馆木樨地南礼士路复兴门西单天安门西天安门东王府井东单建国门永安里国贸大望路四惠四惠东线2西直门车公庄阜成门复兴门长椿街宣武门和平门前门崇文门北京站建国门朝阳门东四十条东直门雍和宫安定门鼓楼大街积水潭线4公益西桥角门西马家堡北京南站陶然亭菜市口宣武门西单灵境胡同西四平安里新街口西直门动物园国家图书馆魏公村人民大学海淀黄庄中关村北京大学东门圆明园西苑北宫门安河桥北线5天通苑北天通苑天通苑南立水桥立水桥南北苑路北大屯路东惠新西街北口惠新西街南口和平西桥和平里北街雍和宫北新桥张自忠路东四灯市口东单崇文门磁器口天坛东门蒲黄榆刘家窑宋家庄线8森林公园南门奥林匹克公园奥体中心北土城线10巴沟苏州街海淀黄庄知春里知春路西土城牡丹园健德门北土城安贞门惠新西街南口芍药居太阳宫三元桥亮马桥农业展览馆团结湖呼家楼金台夕照国贸双井劲松线13西直门大钟寺知春路五道口上地西二旗龙泽回龙观霍营立水桥北苑望京西芍药居光熙门柳芳东直门5.连通问题in.bmp文件如下:t1.bmp文件如下:BMP是常见的图像存储格式。如果用来存黑白图像(颜色深度=1),则其信息比较容易读取。与之相关的数据:(以下偏移均是从文件头开始)偏移:10字节,长度4字节:图像数据真正开始的位置。偏移:18字节,长度4字节:位图的宽度,单位是像素。偏移:22字节,长度4字节:位图的高度,单位是像素。从图像数据开始处,每个像素用1个二进制位表示。从图片的底行开始,一行一行向上存储。Windows规定图像文件中一个扫描行所占的字节数必须是4字节的倍数,不足的位均以0填充。例如,图片宽度为45像素,实际上每行会占用8个字节。可以通过Windows自带的画图工具生成和编辑二进制图像。需要在“属性”中选择“黑白”,指定为二值图像。可能需要通过查看|缩放|自定义...把图像变大比例一些,更易于操作。图像的左下角为图像数据的开始位置。白色对应1,黑色对应0我们可以定义:两个点距离如果小于2个像素,则认为这两个点连通。也就是说:以一个点为中心的九宫格中,围绕它的8个点与它都是连通的。如:t1.bmp所示,左下角的点组成一个连通的群体;而右上角的点都是孤立的。程序的目标是:根据给定的黑白位图,分析出所有独立连通的群体,输出每个连通群体的面积。所谓面积,就是它含有的像素的个数。输入数据固定存在in.bmp中。如示例的in.bmp,程序应该输出:128152133该输出表示:共有4个连通群体。输出的连通体面积间的顺序可以随意。请编程解决上述问题。我们测试程序的时候,会使用不同的in.bmp文件。要求考生把所有函数写在一个文件中。调试好后,存入与考生文件夹下对应题号的“解答.txt”中即可。相关的工程文件不要拷入。对于编程题目,要求选手给出的解答完全符合ANSIC标准,不能使用c++特性;不能使用诸如绘图、中断调用等硬件相关或操作系统相关的API。2012年暑假蓝桥杯决赛题附答案【结果填空】(满分5分)1949年的国庆节(10月1日)是星期六。今年(2012)的国庆节是星期一。那么,从建国到现在,有几次国庆节正好是星期日呢?只要答案,不限手段!可以用windows日历,windows计算器,Excel公式,。。。。。当然,也可以编程!不要求写出具体是哪些年,只要一个数目!千万不要提交源代码!答案不要写在这里,写在“解答.txt”中【代码填空】(满分16分)某工业监控设备不断发回采样数据。每个数据是一个整数(0到1000之间)。各个数据间用空白字符(空格,TAB或回车换行)分隔。这些数据以文本形式被存储在文件中。因为大多数时候,相邻的采样间隔数据是相同的,可以利用这个特征做数据的压缩存储。其方法是:对n(n1)个连续相同的数字只记录n和该数字本身;对m(m0)个连续不重复的数字,则记录m*-1和这些数字本身(之所以用负数,是为了与第一种情况区分,便于解压缩)。例如:采样数字:12343425252525111517281422222213则根据上述规则变化后:-112234425-51115172814322-113下面的程序实现了这个功能。请仔细阅读分析代码,填写空白的部分。voidpop(ints,int*buf,intc,FILE*fp){inti;if(s){fprintf(fp,%d%d,c,*buf);}else{fprintf(fp,%d,-c);for(i=0;ic;i++){fprintf(fp,%d,buf[i]);}}}voiddopack(FILE*r,FILE*w){intbuf[BUF_N];intpos=0;//下一个数字在buf中将要存放的位置intc=0;//当前段已读入的整数个数intpst;intcst;while(fscanf(r,%d,buf+pos)==1){if(c==0){c=pos=1;continue;}if(c==1){pst=buf[0]==buf[1];pos=pos+1-pst;c=2;continue;}cst=buf[pos-1]==buf[pos];if(pst&&!cst){pop(pst,buf,c,w);buf[0]=buf[1];c=pos=1;pst=cst;}elseif(!pst&&cst||pos==BUF_N-1){pop(pst,buf,c-1,w);buf[0]=buf[pos-1];c=2;if(!cst){buf[1]=buf[pos];pos=2;}else{pos=1;pst=______________;//填空1}}else{c++;if(!pst)pos++;}}//whileif(c0)_____________________________;//填空2}voidmain(){FILE*rfp

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

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

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

×
保存成功