2025年蓝桥杯c语言试题及答案_第1页
2025年蓝桥杯c语言试题及答案_第2页
2025年蓝桥杯c语言试题及答案_第3页
2025年蓝桥杯c语言试题及答案_第4页
2025年蓝桥杯c语言试题及答案_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2025年蓝桥杯c语言试题及答案客观题部分(共10题,每题3分,总分30分)以下关于C语言数据类型的描述中,正确的是()A.所有unsigned类型的变量存储的值都为非负整数B.char类型变量在所有编译环境下都占1字节内存C.32位系统下int类型的取值范围是-2^31~2^31D.浮点型变量可以精确存储所有十进制小数答案:A解析:选项B错误,C语言标准仅规定char类型的存储大小至少为1字节,部分嵌入式场景的编译环境中char类型占2字节;选项C错误,32位有符号int类型的最高位为符号位,取值范围为-2^31~2^31-1,最大值需减去全0的情况;选项D错误,浮点型采用二进制科学计数法存储,无法精确表示0.1、0.2这类无法转换为有限位二进制的十进制小数;选项A正确,unsigned类型的所有二进制位均用于存储数值,不存在符号位,因此存储的值均为非负整数。

2.若有定义inta=3,b=5,c=7;则表达式a<b?a++:b++,c+=a的值为()A.10B.11C.12D.13答案:B解析:C语言中逗号运算符的优先级为所有运算符最低,因此表达式先计算逗号左侧的三目运算符,再计算逗号右侧的赋值表达式,最终返回右侧表达式的值。三目运算符中a<b为真,执行a++(后置++先返回原值再自增),因此a最终变为4,三目表达式返回值为3但不会被使用。后续执行c+=a即c=7+4=11,因此整个逗号表达式的最终值为11。若有定义intarr[5]={1,3,5,7,9},*p=arr+2;则执行*p++后,*p的值为()A.3B.5C.7D.9答案:C解析:后置自增运算符优先级高于解引用运算符,因此*p++等价于*(p++)。执行过程为:首先返回指针p当前指向的地址的解引用值(arr[2]=5),之后指针p向后偏移1个int类型的存储单位,指向arr[3]的地址,因此后续访问*p时得到的值为7。以下关于C语言宏定义的描述中,正确的是()A.宏定义的参数类型必须明确声明B.宏替换发生在编译阶段的预处理环节C.带参数的宏的执行效率低于同功能的函数D.宏定义必须写在程序的开头位置答案:B解析:选项A错误,宏替换是纯文本替换,不存在类型检查,参数不需要声明类型;选项C错误,宏替换在预处理阶段完成,运行时不存在函数调用的栈帧开辟、参数传递等开销,执行效率高于同功能的函数;选项D错误,宏定义可以写在程序的任意位置,仅需保证在调用该宏的代码之前完成定义即可;选项B正确,预处理阶段的核心工作包括宏替换、头文件展开、条件编译处理等。对长度为10的无序数组进行升序排序,若采用冒泡排序,最坏情况下需要的元素比较次数为()A.10B.45C.55D.90答案:B解析:冒泡排序的核心逻辑是每一轮遍历将未排序区间的最大值交换到末尾,最坏情况下(数组完全逆序),第1轮需要比较9次,第2轮比较8次,……,第9轮比较1次,总比较次数为n(n-1)/2=10*9/2=45次。若2025年4月13日是星期日,则2025年10月1日是星期______(填写阿拉伯数字,星期日为0,星期一为1……星期六为6)答案:3解析:首先计算两个日期之间的间隔天数:4月剩余天数为30-13=17天,5月31天、6月30天、7月31天、8月31天、9月30天,10月1日当天计1天,总天数为17+31+30+31+31+30+1=171天。每周7天,171mod7=171-7*24=3,因此星期日往后推3天为星期三,对应数值3。

7.1~2025所有整数中,能被3整除或能被5整除的数的个数为______答案:945解析:采用容斥原理计算:能被3整除的数的个数为⌊2025/3⌋=675,能被5整除的数的个数为⌊2025/5⌋=405,能同时被3和5整除(即被15整除)的数的个数为⌊2025/15⌋=135,因此满足条件的数的总个数为675+405-135=945。

8.一棵深度为5的完全二叉树,最少有______个结点(根结点深度为1)答案:16解析:完全二叉树的定义为除最后一层外,其余层均为满结点,最后一层的结点依次从左到右排列。深度为5的完全二叉树最少的情况为前4层为满二叉树,第5层仅存在1个结点。前4层满二叉树的结点总数为2^4-1=15,加上第5层的1个结点,总最少结点数为16。

9.表达式0x13\&0x17|0x06的值为______(用十进制表示)

答案:23解析:首先将十六进制数转换为二进制:0x13对应二进制10011,0x17对应二进制10111,0x06对应二进制00110。按位与运算规则为同1为1,否则为0,因此0x13\&0x17的结果为10011(十进制19)。按位或运算规则为有1为1,否则为0,因此19|6=10011|00110=10111,转换为十进制为23。

10.以下递归函数执行f(5)的返回值为______

intf(intn){

if(n<=1)return1;

returnf(n-1)+2*f(n-2);

}答案:21解析:递归展开计算:f(0)=1,f(1)=1;f(2)=f(1)+2f(0)=1+21=3;f(3)=f(2)+2f(1)=3+21=5;f(4)=f(3)+2f(2)=5+23=11;f(5)=f(4)+2f(3)=11+25=21。编程题部分(共6题,总分70分)试题1数位和统计(10分)【问题描述】给定一个正整数n,请计算从1到n的所有整数的数位和之和,数位和指的是一个数所有数位上的数字相加的结果,比如123的数位和是1+2+3=6。【输入格式】输入一行,包含一个正整数n,1<=n<=1e6。【输出格式】输出一行,包含一个整数,表示所求的和。【样例输入】12【样例输出】51【样例解释】1到12的数位和分别是1,2,3,4,5,6,7,8,9,1,2,3,总和为45+6=51。参考代码:

#include<stdio.h>

intmain(){

intn,ans=0;

scanf("\%d",\&n);

for(inti=1;i<=n;i++){

intx=i;

while(x>0){

ans+=x\%10;

x/=10;

}

}

printf("\%d",ans);

return0;

}考点解析:本题考察基础循环与数位操作,n最大为1e6,总操作次数约为1e6*7=7e6,完全在时间限制范围内。注意无需使用数位DP优化,暴力解法即可通过所有测试用例,边界情况n=1时输出1,n=9时输出45均需验证正确。试题2密码验证(10分)【问题描述】网站注册时需要验证密码是否符合规则,规则如下:1.密码长度至少8位,最多20位;2.必须包含大写字母、小写字母、数字、特殊符号(仅包括!@#$%^&*)四类字符中的至少三类;3.不能有连续3个相同的字符;4.不得包含上述四类以外的字符。请你编写程序判断给定的密码是否符合规则。

【输入格式】输入一行,为待验证的密码字符串,字符串不含空格,长度不超过20。【输出格式】若符合规则输出”YES”,否则输出”NO”。【样例输入1】Abc123!@#【样例输出1】YES【样例输入2】aaa123456【样例输出2】NO【样例解释】样例2存在连续3个相同字符’a’,不符合规则。参考代码:

#include<stdio.h>

#include<string.h>

intisSpecial(charc){

charsp[]="!@#$\%^\&*";

for(inti=0;i<8;i++){

if(c==sp[i])return1;

}

return0;

}

intmain(){

chars[25];

scanf("\%s",s);

intlen=strlen(s);

if(len<8||len>20){

printf("NO");

return0;

}

inttypeCnt[4]={0};//0大写、1小写、2数字、3特殊符号

for(inti=0;i<len;i++){

if(s[i]>='A'\&\&s[i]<='Z')typeCnt[0]++;

elseif(s[i]>='a'\&\&s[i]<='z')typeCnt[1]++;

elseif(s[i]>='0'\&\&s[i]<='9')typeCnt[2]++;

elseif(isSpecial(s[i]))typeCnt[3]++;

else{//存在非法字符

printf("NO");

return0;

}

}

intvalidType=0;

for(inti=0;i<4;i++){

if(typeCnt[i]>0)validType++;

}

if(validType<3){

printf("NO");

return0;

}

for(inti=2;i<len;i++){

if(s[i]==s[i-1]\&\&s[i]==s[i-2]){

printf("NO");

return0;

}

}

printf("YES");

return0;

}考点解析:本题考察字符串处理与条件判断,需按规则逐一验证,注意判断非法字符的逻辑要放在字符类型统计环节,避免不符合要求的字符被误判为其他类型。边界情况如长度刚好为8、刚好包含三类字符、连续2个相同字符均为合法情况,需验证正确。试题3最优采摘路线(12分)【问题描述】小明在一个n行m列的果园里采摘水果,果园每个格子里的水果重量为a[i][j],小明从左上角(1,1)出发,只能向右或者向下走,最终到达右下角(n,m),每个格子只能走一次,请问小明最多能采摘多少重量的水果?【输入格式】第一行两个整数n,m,1<=n,m<=1000。接下来n行,每行m个整数,表示a[i][j],0<=a[i][j]<=1e3。【输出格式】输出一个整数,表示最大采摘重量。【样例输入】33131151421【样例输出】12【样例解释】最优路线为(1,1)->(1,2)->(2,2)->(3,2)->(3,3),总重量为1+3+5+2+1=12。参考代码:

#include<stdio.h>

#definemax(a,b)((a)>(b)?(a):(b))

intdp[1005]={0};

intmain(){

intn,m,val;

scanf("\%d\%d",\&n,\&m);

for(inti=1;i<=n;i++){

for(intj=1;j<=m;j++){

scanf("\%d",\&val);

dp[j]=max(dp[j],dp[j-1])+val;

}

}

printf("\%d",dp[m]);

return0;

}考点解析:本题考察动态规划的经典方格取数问题,状态转移方程为dp[i][j]=max(dp[i-1][j],dp[i][j-1])+a[i][j],表示到达(i,j)位置的最大采摘重量为上方或左方位置的最大值加上当前格子的重量。采用一维数组优化空间,仅需O(m)的空间复杂度,时间复杂度为O(nm),可轻松通过n,m<=1000的测试用例。试题4区间异或和(13分)【问题描述】给定一个长度为n的数组a,有q次查询,每次查询给定l和r,求区间[l,r]内所有元素的异或和。【输入格式】第一行两个整数n,q,1<=n,q<=2e5。第二行n个整数,为数组a的元素,0<=a[i]<=1e9。接下来q行,每行两个整数l,r,1<=l<=r<=n。【输出格式】对于每个查询,输出一行一个整数,表示对应的异或和。【样例输入】5312345132415【样例输出】051【样例解释】123=0,234=5,12345=1。参考代码:

#include<stdio.h>

#defineMAXN200005

intpreXor[MAXN]={0};

intmain(){

intn,q,val;

scanf("\%d\%d",\&n,\&q);

for(inti=1;i<=n;i++){

scanf("\%d",\&val);

preXor[i]=preXor[i-1]^val;

}

while(q--){

intl,r;

scanf("\%d\%d",\&l,\&r);

printf("\%d\n",preXor[r]^preXor[l-1]);

}

return0;

}考点解析:本题考察前缀异或的应用,利用异或的自反性(aa=0、a0=a),前缀异或数组preXor[i]表示前i个元素的异或和,区间[l,r]的异或和等于preXor[r]^preXor[l-1],可实现O(1)处理每次查询,总时间复杂度为O(n+q),满足2e5的数据规模要求。注意数组大小需设置为2e5以上,避免越界。试题5排队打水(15分)【问题描述】有n个人排队在打水,每个人打水需要的时间为t[i],只有一个水龙头,请问如何安排排队顺序,使得所有人的等待时间之和最小?等待时间指的是每个人从开始排队到自己打完水的总时间。【输入格式】第一行一个整数n,1<=n<=1e5。第二行n个整数,t[i],1<=t[i]<=1e3。【输出格式】输出一个整数,表示最小的总等待时间。【样例输入】3312【样例输出】10【样例解释】按1、2、3的顺序排队,总等待时间为1+(1+2)+(1+2+3)=10。参考代码:

#include<stdio.h>

#include<algorithm>

usingnamespacestd;

#defineMAXN100005

intt[MAXN];

intmain(){

intn;

scanf("\%d",\&n);

for(inti=0;i<n;i++){

scanf("\%d",\&t[i]);

}

sort(t,t+n);

longlongans=0,sum=0;

for(inti=0;i<n;i++){

sum+=t[i];

ans+=sum;

}

printf("\%lld",ans);

return0;

}考点解析:本题考察贪心算法的应用,最优策略为按打水时间从小到大排序,优先安排打水时间短的人,可减少后续所有人的等待时间总和。时间复杂度为O(nlogn),主要为排序的开销。注意总等待时间最大可达1e5*1e3*1e5=1e13,需用longlong类型存储结果,避免int溢出。试题6子集和计数(20分)【问题描述】给定n个正整数a[i],求有多少个非空子集,使得子集的和等于k,结果对1e9+7取模。【输入格式】第一行两个整数n,k,1<=n<=40,1<=k<=1e9。第二行n个正整数a[i],1<=a[i]<=1e8。【样例输入】451234【样例输出】2【样例解释】子集{1,4}和{2,3}的和为5,共2个。参考代码:

#include<stdio.h>

#include<vector>

#include<algorithm>

usingnamespacestd;

constintMOD=1e9+7;

vector<longlong>getSubsetSum(vector<int>\&arr){

intlen=arr.size();

vector<longlong>res;

for(intmask=0;mask<(1<<len);mask++){

longlongs=0;

for(inti=0;i<len;i++){

if(mask\&(1<<i)){

s+=arr[i];

}

}

res.push_back(s);

}

returnres;

}

intmain(){

intn;

longlongk;

scanf("\%d\%lld",\&n,\&k);

vector<int>a(n);

for(inti=0;i<n;i++){

scanf("\%d",\&a[i]);

}

//折半搜索,将数组分为两部分

vector<int>left(a.begin(),a.begin()

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论