第四届蓝桥杯真题及答案A组C文档格式.docx
《第四届蓝桥杯真题及答案A组C文档格式.docx》由会员分享,可在线阅读,更多相关《第四届蓝桥杯真题及答案A组C文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
他却给抄成了:
396x45=?
但结果却很戏剧性,他的答案竟然是对的!
!
因为36*495=396*45=17820
类似这样的巧合情况可能还有很多,比如:
27*594=297*54
假设abcde代表1~9不同的5个数字(注意是各不相同的数字,且不含0)能满足形如:
ab*cde=adb*ce这样的算式一共有多少种呢?
请你利用计算机的优势寻找
所有的可能,并回答不同算式的种类数。
满足乘法交换律的算式计为不同的种类,所以答案肯定是个偶数。
答案直接通过浏览器提交。
只提交一个表示最终统计种类数的数字,不要提交解答过程或其它多余的内容。
快速解题技巧:
暴力秒吧。
五重循环,绝对很快出答案。
根据给的那个ab*cde=adb*ce算式,五个变量,一个判断条件,直接跑。
很方便。
答案为:
142
3.结果填空(满分8分)
第39级台阶小明刚刚看完电影《第39级台阶》,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级!
站在台阶前,他突然又想着一个问题:
如果我每一步只能迈上1个或2个台阶。
先迈左脚,然后左右交替,最后一步是迈
右脚,也就是说一共要走偶数步。
那么,上完39级台阶,有多少种不同的上法呢?
请你利用计算机的优势,帮助小明寻找答案。
要求提交的是一个整数。
不要提交解答过程,或其它的辅助说明文字。
首先,踏到第i层有4种方法,分为:
用左或右脚在第i-1或第i-2层踏上。
此时只需加一个判断是左还是右脚踏的变量就可以用一个递归或递推算出答案。
当然你要是对递归有些
不放心大可用二维的,一个判断左还是右一个维度的值存左或右脚踏上这层的方法数,来求解问题。
51167078
递归代码:
[cpp]viewplaincopyprint?
1.#include<
stdio.h>
2.
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.}
#include<
intfun(intn,intflag){
if(n==1){
if(flag==1)
return1;
elsereturn0;
}
elseif(n==2){
return(fun(n-1,!
}
intmain()
{
printf("
return0;
4.结果填空(满分12分)
黄金连分数
黄金分割数0.61803...是个无理数,这个常数十分重要,在许多工程问题中会出现。
有时需要把这个数字求得很精确。
对于某些精密工程,常数的精度很重要。
也许你听说过哈勃太空望远镜,它首次升空后就发现了一处人工加工错误,对那样一个庞然大物,其实只是镜面加工时有比头发丝
还细许多倍的一处错误而已,却使它成了“近视眼”!
!
言归正传,我们如何求得黄金分割数的尽可能精确的值呢?
有许多方法。
比较简单的一种是用连分数:
1
黄金数=---------------------
1+-----------------
1+-------------
1+---------
1+...
这个连分数计算的“层数”越多,它的值越接近黄金分割数。
请你利用这一特性,求出黄金分割数的足够精确值,要求四舍五入到小数点后100位。
小数点后3位的值为:
0.618小数点后4位的值为:
0.6180小数点后5位的值为:
0.61803小数点后7位的值为:
0.6180340(注意尾部的0,不能忽略)
你的任务是:
写出精确到小数点后100位精度的黄金分割值。
注意:
尾数的四舍五入!
尾数是0也要保留!
显然答案是一个小数,其小数点后有100位数字,请通过浏览器直接提交该数字。
不要提交解答过程,或其它辅助说明类的内容。
此题首先明确,小数点后面100位数,不可能用某个变量来存起来,所以应当想到大数据的存储。
此题用java的大数据处理无遗会减少很多时间,因为你节约了写大整数的运算
函数了。
这题如果一开始能联想到斐波那契数的话再加上会java的大整数运算,那么很快就能过了,选择斐波那契数里面某两个连续的数,小的做被除数,大的做除数。
利用
java的大整数,每一位存起两数的商值,然后将余数乘以10再做被除数,除数不变。
一直算到一百位即可。
当然最最快速的方法莫过于出去上个厕所拿手机出来XX一下。
100位直接到手。
是不是很快?
0.61803398874989484820458683436563811772030917980576
28621354486227052604628189024497072072041893911374
5.代码填空(满分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]>
intt=x[right];
x[right]=x[p];
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(N<
100)表示后面数据行数。
接着读入N行数据。
每行数据长度不等,是用空格分开的若干个(不大于100个)正整数(不大于100000)每个整数代表一个ID号。
要求程序输出1行,含两个整数mn,用空格分隔。
其中,m表示断号ID,n表示重号ID
例如:
用户输入:
2
56811910129
则程序输出:
79
再例如:
6
164178108109180155141159104182179118137184115124125129168196172189127107112192103131133169158
128102110148139157140195197
185152135106123173122136174191145116151143175120161134162190149138142146199126165156153193144166170121171132101
194187188113130176154177120117150114183186181100163160167147198111119
105120
资源约定:
峰值内存消耗<
64M
CPU消耗<
1000ms
请严格按要求输出,不要画蛇添足地打印类似:
“请您输入...”的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:
main函数需要返回0
只使用ANSIC/ANSIC++标准,不要调用依赖于编译环境或操作系统的特殊函数。
所有依赖的函数必须明确地在源文件中#include<
xxx>
,不能通过工程设置而省略常用头文件。
提交时,注意选择所期望的编译器类型。
数据不大,开个数组,判断是否输入号码,若输入过了即为重号,记下;
输入完之后一个for循环直接求出没输入的那个值,答案即出。
8.程序设计(满分10分)
翻硬币
小明正在玩一个“翻硬币”的游戏。
桌上放着排成一排的若干硬币。
我们用*表示正面,用o表示反面(是小写字母,不是零)。
比如,可能情形是:
**oo***oooo
如果同时翻转左边的两个硬币,则变为:
oooo***oooo现在小明的问题是:
如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的
局面,最少要翻动多少次呢?
我们约定:
把翻动相邻的两个硬币叫做一步操作,那么要求:
程序输入:
两行等长的字符串,分别表示初始状态和要达到的目标状态。
每行的长度<
1000
程序输出:
一个整数,表示最小操作步数
**********
o****o****
程序应该输出:
5
*o**o***o***
*o***o**o***
所有依赖的函数必须明确地在源文件中#include<
这题看了下别人思路,利用贪心原理,从第一个开始两串字符串一个一个的比,不相等就翻一下,然后就相等了,就这样一个一个的翻。
最后代码对测试用例是对的,但是是否
这就对所有测试数据都成立,也就是这个思想是不是对的,还有待考证。
若哪位大神知道,还请不啻授教。
贪心代码:
3.#defineN1001
4.chars1[N],s2[N];
5.
6.charbecome(charc){
7.switch(c){
8.case'
*'
:
return'
o'
;
9.case'
10.}
12.
13.intf(char*a,char*b){
14.intnum=0;
15.while(*a){
16.if(*a!
=*b){
17.*a=become(*a);
18.*(a+1)=become(*(a+1));
19.num++;
20.}
21.a++,b++;
22.}
23.returnnum;
24.}
25.
26.intmain()
27.{
28.while(~scanf("
%s%s"
s1,s2)){
29.printf("
f(s1,s2));
30.}
31.return0;
32.}
#defineN1001
chars1[N],s2[N];
charbecome(charc){
switch(c){
case'
intf(char*a,char*b){
intnum=0;
while(*a){
if(*a!
=*b){
*a=become(*a);
*(a+1)=become(*(a+1));
num++;
a++,b++;
returnnum;
while(~scanf("
s1,s2)){
9.程序设计(满分16分)
带分数
100可以表示为带分数的形式:
100=3+69258/714还可以表示为:
100=82+3546/197
注意特征:
带分数中,数字1~9分别出现且只出现一次(不包含0)。
类似这样的带分数,100有11种表示法。
题目要求:
从标准输入读入一个正整数N(N<
1000*1000)
程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。
不要求输出每个表示,只统计有多少表示法!
100
11
105
3000ms
除了暴力,暂时还没想到其它好的方法。
有懂的大神,还请教教小弟。
10.程序设计(满分29分)
连号区间数
小明这些天一直在思考这样一个奇怪而有趣的问题:
在1~N的某个全排列中有多少个连号区间呢?
这里所说的连号区间的定义是:
如果区间[L,R]里的所有元素(即此排列的第L个到第R个元素)递增排序后能得到一个长度
为R-L+1的“连续”数列,则称这个区间连号区间。
当N很小的时候,小明可以很快地算出答案,但是当N变大的时候,问题就不是那么简单了,现在小明需要你的帮助。
输入格式:
第一行是一个正整数N(1<
=N<
=50000),表示全排列的规模。
第二行是N个不同的数字Pi(1<
=Pi<
=N),表示这N个数字的某一全排列。
输出格式:
输出一个整数,表示不同连号区间的数目。
示例:
4
3241
程序应输出:
7
用户输入:
5
34251
9
解释:
第一个用例中,有7个连号区间分别是:
[1,1],[1,2],[1,3],[1,4],[2,2],[3,3],[4,4]
第二个用例中,有9个连号区间分别是:
[1,1],[1,2],[1,3],[1,4],[1,5],[2,2],[3,3],[4,4],[5,5]
5000ms
这样的题,理解清楚题意,根据上面题目提示说要是连续区间,则区间里的所有的人数排序后就是递增的而且每次只增1,所以L-R+1是区间的长度同时也一定是这个区间里最
大值与最小值的差值,即两个值时相等的,因此若不相等,则就不是连续区间。
想通这一点代码一点都不难了。