第四届蓝桥杯真题及答案A组C答案1.结果填空(满分4分)题目标题:高斯日记大数学家高斯有个好习惯:无论如何都要记日记。他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?高斯出生于:1777年4月30日。在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日。高斯获得博士学位的那天日记上标着:8113请你算出高斯获得博士学位的年月日。提交答案的格式是:yyyy-mm-dd,例如:1980-03-21请严格按照格式,通过浏览器提交答案。注意:只提交这个日期,不要写其它附加内容,比如:说明性的文字。考场快速解题:先看1778是闰年么?答案是不是,所以8113-365=7748,又1779也不是,所以再减365得7383,然后1780是的,所以减去366得7017,又1781,1782,1783,肯定都不是所以连减3个365得5922,然后又是闰年,-366,再-365-365-365-366-365-365-365-366-365-365-365~-366-365-365-3651799得78,即这一天是1799年4月30日之后的78天,5月31天,-31,6月30天,-30,剩17天,此时即加上两个月,为1799年6月30日,然后往后数17天,即为1799年7月16日。答案即为:1799-07-162.结果填空(满分5分)标题:马虎的算式小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。有一次,老师出的题目是:36x495=?他却给抄成了:396x45=?但结果却很戏剧性,他的答案竟然是对的!!因为36*495=396*45=17820类似这样的巧合情况可能还有很多,比如:27*594=297*54假设abcde代表1~9不同的5个数字(注意是各不相同的数字,且不含0)能满足形如:ab*cde=adb*ce这样的算式一共有多少种呢?请你利用计算机的优势寻找所有的可能,并回答不同算式的种类数。满足乘法交换律的算式计为不同的种类,所以答案肯定是个偶数。答案直接通过浏览器提交。注意:只提交一个表示最终统计种类数的数字,不要提交解答过程或其它多余的内容。快速解题技巧:暴力秒吧。五重循环,绝对很快出答案。根据给的那个ab*cde=adb*ce算式,五个变量,一个判断条件,直接跑。很方便。答案为:1423.结果填空(满分8分)题目标题:第39级台阶小明刚刚看完电影《第39级台阶》,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级!站在台阶前,他突然又想着一个问题:如果我每一步只能迈上1个或2个台阶。先迈左脚,然后左右交替,最后一步是迈右脚,也就是说一共要走偶数步。那么,上完39级台阶,有多少种不同的上法呢?请你利用计算机的优势,帮助小明寻找答案。要求提交的是一个整数。注意:不要提交解答过程,或其它的辅助说明文字。快速解题技巧:首先,踏到第i层有4种方法,分为:用左或右脚在第i-1或第i-2层踏上。此时只需加一个判断是左还是右脚踏的变量就可以用一个递归或递推算出答案。当然你要是对递归有些不放心大可用二维的,一个判断左还是右一个维度的值存左或右脚踏上这层的方法数,来求解问题。答案为:51167078递归代码:[cpp]viewplaincopyprint?1.#includestdio.h2.3.intfun(intn,intflag){4.if(n==1){5.if(flag==1)6.return1;7.elsereturn0;8.}9.elseif(n==2){10.return1;11.}12.return(fun(n-1,!flag)+fun(n-2,!flag));13.}14.15.intmain()16.{17.printf(%d\n,fun(39,0));18.return0;19.}4.结果填空(满分12分)标题:黄金连分数黄金分割数0.61803...是个无理数,这个常数十分重要,在许多工程问题中会出现。有时需要把这个数字求得很精确。对于某些精密工程,常数的精度很重要。也许你听说过哈勃太空望远镜,它首次升空后就发现了一处人工加工错误,对那样一个庞然大物,其实只是镜面加工时有比头发丝还细许多倍的一处错误而已,却使它成了“近视眼”!!言归正传,我们如何求得黄金分割数的尽可能精确的值呢?有许多方法。比较简单的一种是用连分数:1黄金数=---------------------11+-----------------11+-------------11+---------1+...这个连分数计算的“层数”越多,它的值越接近黄金分割数。请你利用这一特性,求出黄金分割数的足够精确值,要求四舍五入到小数点后100位。小数点后3位的值为:0.618小数点后4位的值为:0.6180小数点后5位的值为:0.61803小数点后7位的值为:0.6180340(注意尾部的0,不能忽略)你的任务是:写出精确到小数点后100位精度的黄金分割值。注意:尾数的四舍五入!尾数是0也要保留!显然答案是一个小数,其小数点后有100位数字,请通过浏览器直接提交该数字。注意:不要提交解答过程,或其它辅助说明类的内容。快速解题技巧:此题首先明确,小数点后面100位数,不可能用某个变量来存起来,所以应当想到大数据的存储。此题用java的大数据处理无遗会减少很多时间,因为你节约了写大整数的运算函数了。这题如果一开始能联想到斐波那契数的话再加上会java的大整数运算,那么很快就能过了,选择斐波那契数里面某两个连续的数,小的做被除数,大的做除数。利用java的大整数,每一位存起两数的商值,然后将余数乘以10再做被除数,除数不变。一直算到一百位即可。当然最最快速的方法莫过于出去上个厕所拿手机出来百度一下。100位直接到手。是不是很快?!答案为:0.61803398874989484820458683436563811772030917980576286213544862270526046281890244970720720418939113745.代码填空(满分5分)题目标题:前缀判断如下的代码判断needle_start指向的串是否为haystack_start指向的串的前缀,如不是,则返回NULL。比如:abcd1234就包含了abc为前缀char*prefix(char*haystack_start,char*needle_start){char*haystack=haystack_start;char*needle=needle_start;while(*haystack&&*needle){if(______________________________)returnNULL;//填空位置}if(*needle)returnNULL;returnhaystack_start;}请分析代码逻辑,并推测划线处的代码,通过网页提交。注意:仅把缺少的代码作为答案,千万不要填写多余的代码、符号或说明文字!!快速解题技巧:这样的题考的就是你对指针的理解程度,将题意看懂,*needle_start的数组若是*haystack_start数组的前缀则*haystack_start的前len个字符和*needle_start数组的前len个字符对等。而len的值即为*needle_start数组的长度。所以什么情况下才是真呢?一个一个的比嘛,直到某一方比完,或者出现了不等,出现了不等则不是其前缀,即返回NULL,若比完了一方,则看被比完的是哪一方,若是*needle_start被比完了,那么就代表它是另一数组的前缀,返回头指针,若是*haystack_start被比完了,那么就代表着*haystack_start数组是*needle_start数组的前缀,即为相反了,故不是,返回NULL。答案:*haystack++!=*needle++6.代码填空(满分7分)标题:三部排序一般的排序有许多经典算法,如快速排序、希尔排序等。但实际应用时,经常会或多或少有一些特殊的要求。我们没必要套用那些经典算法,可以根据实际情况建立好的解法。比如,对一个整型数组中的数字进行分类排序:使得负数都靠左端,正数都靠右端,0在中部。注意问题的特点是:负数区域和正数区域内并不要求有序。可以利用这个特点通过1次线性扫描就结束战斗!!以下的程序实现了该目标。其中x指向待排序的整型数组,len是数组的长度。voidsort3p(int*x,intlen){intp=0;intleft=0;intright=len-1;while(p=right){if(x[p]0){intt=x[left];x[left]=x[p];x[p]=t;left++;p++;}elseif(x[p]0){intt=x[right];x[right]=x[p];x[p]=t;right--;}else{__________________________;//填空位置}}}如果给定数组:25,18,-2,0,16,-5,33,21,0,19,-16,25,-3,0则排序后为:-3,-2,-16,-5,0,0,0,21,19,33,25,16,18,25请分析代码逻辑,并推测划线处的代码,通过网页提交注意:仅把缺少的代码作为答案,千万不要填写多余的代码、符号或说明文字!!快速解题技巧:类似快排,根据代码拿着数组自己用手纸笔模拟走一两趟让他碰上0这个关键值,然后你就要想如何让这个代码实现排序,在0这个位置要加个什么代码,相信只要你手动运行了一遍,你会很快得出答案的。答案:p++7.程序设计(满分4分)标题:错误票据某涉密单位下发了某种票据,并要在年终全部收回。每张票据有唯一的ID号。全年所有票据的ID号是连续的,但ID的开始数码是随机选定的。因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某个ID断号,另外一个ID重号。你的任务是通过编程,找出断号的ID和重号的ID。假设断号不可能发生在最大和最小号。要求程序首先输入一个整数N(N100)表示后面数据行数。接着读入N行数据。每行数据长度不等,是用空格分开的若干个(不大于100个)正整数(不大于100000)每个整数代表一个ID号。要求程序输出1行,含两个整数mn,用空格分隔。其中,m表示断号ID,n表示重号ID例如:用户输入:256811910129则程序输出:79再例如:用户输入:6164178108109180155141159104182179118137184115124125129168196172189127107112192103131133169158128102110148139157140195197185152135106123173122136174191145116151143175120161134162190149138142146199126165156153193144166170121171132101194187188113130176154177120117150114183186181100163160167147198111119则程序输出:105120资源约定:峰值内存消耗64MCPU消耗1000ms请严格按要求输出,不要画蛇添足地打印类似:“请您输入...”的多余内容。所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。注意:main函数需要返回0注意:只使用ANSIC/ANSIC++标准,不要调用依赖于编译环境或操作系统的特殊函数。注意:所有依赖的函数必须明确地在源文件中#includexxx,不能通过工程设置而省略常用头文件。提交时,注意选择所期望的编译器类型。快速解题技巧:数据不大,开个数组,判断是否输入号码,若输入过了即为重号,记下;输入完之后一个for循环