news 2026/6/10 13:14:25

考研C语言专题练习

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
考研C语言专题练习

考研C语言专题练习

引言

这篇文章的本质是我学完考研C语言之后做的针对所学内容的练习题目

题目一:挂盐水

题目链接:http://oj.lgwenda.com/problem/1014
这是我的想法,得分50,我的问题在于代码逻辑完全误解了题目描述的滴水和停顿模式。其次我尝试用奇偶轮次来区分滴水和停顿,但题目中的"一轮"本身就包含了"滴水+停顿"

#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){intvul,D;while(scanf("%d%d",&vul,&D)!=EOF){intt=0;//滴水的总时间intcount=0;//已经滴水的总滴数inti=1;//第几次滴水intj=1;//这次滴几滴水while(1){if(vul-count*D<(j+1)*D){t+=(vul-count*D)/D+1;break;}if(i%2!=0){count+=j;t+=j;i++;j++;}else{i++;t++;}}printf("%d\n",t);}return0;}

把判断条件从水量转化成总共需要滴多少毫升下去,思路就清晰了
下面是正确的答案:

#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){intvul,D;while(scanf("%d%d",&vul,&D)!=EOF){intt=0;// 滴水的总时间intcount=0;// 已经滴水的总滴数inti=1;// 第几次滴水intneed=vul%D==0?(vul/D):(vul/D+1);// 总共需要的滴数while(1){if(count+i>=need){// 最后一轮t+=need-count;// 只需加上剩余的滴数(每滴1秒)break;}// 滴水count+=i;t+=i;// 停 1 秒t+=1;i++;}printf("%d\n",t);}return0;}

题目二:坑爹的黑店

题目链接:http://oj.lgwenda.com/problem/1015
我的想法是:

  1. 将三种饮料的价格用分代替,避免浮点数(这点刚好题目也这么要求)
  2. 将橙汁由一瓶可乐和一瓶矿泉水代替,简化成两种变量
  3. 找可乐价格和橙汁价格的最小公倍数600
  4. 先用若干个600分单元尽可能多地消耗金额,剩余不足600分的零头部分,再通过枚举矿泉水与可乐的组合方式,使最终剩余金额最小。两部分剩余之和即为最少小费。

写出来的代码如下,只得50分,我的问题在于明知用这种单元逼近的方法中间可能会存在更优组合,但是没有思路,只能这么做。

#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>intgcd(inta,intb){while(b!=0){intr=a%b;a=b;b=r;}returna;}intmain(){intT=0;scanf("%d",&T);int*arr=(int*)malloc(T*sizeof(int));for(intm=0;m<T;m++){intN=0;scanf("%d",&N);arr[m]=N;}for(intm=0;m<T;m++){inta=150;intb=200;inti=600;intleast=arr[m]>i?arr[m]%i:arr[m];intresult=0;//分类讨论if(least<150){result=least;}elseif(150<=least&&least<200){result=least-150;}elseif(200<=least&&least<300){result=least-200;}elseif(300<=least&&least<350){result=least-300;}elseif(350<=least&&least<400){result=least-350;}elseif(400<=least&&least<450){result=least-400;}elseif(450<=least&&least<550){result=least-450;}elseif(550<=least&&least<600){result=least-550;}printf("%d\n",result);}return0;}

这题其实是个数学问题,将题目用公式表示为N = (3x+4y) * 50 + 零钱 (x和y均为非负整数),通过枚举能够发现,3x+4y 能够表示6及以上的任何一个数字,故代码也就转换成了300金额以下和以上的讨论。
扩展知识:3x+4y的性质,可自行了解

下面是正确的答案:

#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>intmain(){intT=0;scanf("%d",&T);int*arr=(int*)malloc(T*sizeof(int));for(intm=0;m<T;m++){intN=0;scanf("%d",&N);arr[m]=N;}for(intm=0;m<T;m++){inta=150;intb=200;inti=600;intresult=0;//分类讨论if(arr[m]<150){result=arr[m];}elseif(150<=arr[m]&&arr[m]<200){result=arr[m]-150;}elseif(200<=arr[m]&&arr[m]<300){result=arr[m]-200;}elseif(300<=arr[m]){result=arr[m]%50;}printf("%d\n",result);}return0;

题目三:手机话费

题目链接:http://oj.lgwenda.com/problem/1016
一命通关,不做解释

#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>intmain(){while(1){intM,K;intresult=0;scanf("%d%d",&M,&K);if(M==0&&K==0){break;}while(M>0){if(M<K){result+=M;break;}M-=K;result+=K;M++;}printf("%d\n",result);}return0;}

题目四:统计硬币

题目链接:http://oj.lgwenda.com/problem/1017
这道题如果想找一种数学方法来进行解决是有些困难的,这里直接枚举即可,就是注意一下这三个数的遍历怎么写和边界条件。同样,一命通关

#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){intT;scanf("%d",&T);for(inti=0;i<T;i++){intm,n;scanf("%d%d",&n,&m);intresult=0;for(inta=0;a<=n;a++){for(intb=0;b<=n-a;b++){intc=n-a-b;if(a+b*2+c*5==m){result++;}}}printf("%d\n",result);}return0;}

题目五:合并有序数组

题目链接:http://oj.lgwenda.com/problem/1032
一看就想到了归并操作,由于没看清题目是输入多组数据和每组数据的输出结果单独占据一行,进行了多次修改,但总体来说一开始的代码逻辑是没有问题的。

#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>intmain(){intm,n;while(scanf("%d",&m)!=EOF){int*marr=(int*)malloc(m*sizeof(int));for(inti=0;i<m;i++){scanf("%d",&marr[i]);}scanf("%d",&n);int*narr=(int*)malloc(n*sizeof(int));for(inti=0;i<n;i++){scanf("%d",&narr[i]);}//归并操作int*arr=(int*)malloc((m+n)*sizeof(int));inti=0;intj=0;intk=0;for(i=0,j=0,k=0;i<m&&j<n;k++){if(marr[i]>=narr[j]){arr[k]=narr[j];j++;}else{arr[k]=marr[i];i++;}}while(i<m){arr[k]=marr[i];i++;k++;}while(j<n){arr[k]=narr[j];j++;k++;}for(inti=0;i<(m+n);i++){if(i==(m+n)-1){printf("%d",arr[i]);break;}printf("%d ",arr[i]);}printf("\n");//释放内存free(narr);free(marr);free(arr);}return0;}

题目六:计算距离

题目链接:http://oj.lgwenda.com/problem/1025
这道题也是一命通关,就是在写强制类型转换的时候,sqrt(double((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)));能在本地通过,在测评器上就不行了,这是因为这种转换是C++的风格,C风格的强制转换应该在加个括号:sqrt((double)((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)));

#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<math.h>doubledistance(intx1,inty1,intx2,inty2){returnsqrt((double)((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)));}intmain(){intn;doubleresult=0.0;scanf("%d",&n);int*xarr=(int*)malloc(n*sizeof(int));int*yarr=(int*)malloc(n*sizeof(int));for(inti=0;i<n;i++){scanf("%d",&xarr[i]);scanf("%d",&yarr[i]);}for(inti=0;i<n-1;i++){result+=distance(xarr[i],yarr[i],xarr[i+1],yarr[i+1]);}printf("%.2lf",result);free(xarr);free(yarr);return0;}

题目七:有序插入

题目链接:http://oj.lgwenda.com/problem/1030
也是一次通关,其实有更简单的方法,我使用链表写,主要是为了复习链表的操作

#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<math.h>typedefstructnode{intdata;structnode*next;}node_t;typedefstructlist{node_t*phead;node_t*ptail;}link_list_t;voidsort_insert(link_list_t*plist,intdata){//给新节点进行初始化node_t*newnode=(node_t*)malloc(sizeof(node_t));newnode->data=data;newnode->next=NULL;//分类讨论if(plist->phead==NULL){plist->phead=newnode;plist->ptail=newnode;}elseif(newnode->data<=plist->phead->data){newnode->next=plist->phead;plist->phead=newnode;}else{node_t*pre=plist->phead;//慢指针node_t*cur=pre->next;//快指针while(cur!=NULL){if(cur->data>newnode->data){newnode->next=pre->next;pre->next=newnode;break;}pre=pre->next;cur=pre->next;}//退化成尾插法if(cur==NULL){plist->ptail->next=newnode;plist->ptail=newnode;}}}//遍历打印函数voidprint(link_list_t*plist){node_t*mark=plist->phead;while(mark!=NULL){printf("%d\n",mark->data);mark=mark->next;}}intmain(){link_list_tplist;plist.phead=NULL;plist.ptail=NULL;for(inti=0;i<10;i++){inta=0;scanf("%d",&a);sort_insert(&plist,a);}print(&plist);return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 11:39:48

【计算机毕业设计案例】基于springboot的个人健康管理系统基于springboot个人健康档案管理系统(程序+文档+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/6/10 11:41:35

【Docker】解决Docker容器时间与宿主机时间不一致的几种方法

一、介绍 由于Docker容器内的时间默认是 UTC 世界标准时间&#xff0c;而宿主机时间为 CST 中国标准时间&#xff08;东八区&#xff0c;Asia/Shanghai&#xff09;&#xff0c;时间相差8小时&#xff0c;根本原因是时区问题。因此&#xff0c;需要为Docker容器配置正确的时区&…

作者头像 李华
网站建设 2026/6/5 18:13:58

直播美颜SDK怎么选?从人脸美型效果、性能与成本全面分析

在直播行业卷到“美颜都快成标配”的今天&#xff0c;不管你是做直播平台、社交产品&#xff0c;还是短视频、电商直播&#xff0c;选对一款直播美颜SDK&#xff0c;往往直接影响用户留存率和产品口碑。 问题是&#xff1a; 市面上的直播美颜SDK这么多&#xff0c;看起来功能都…

作者头像 李华
网站建设 2026/6/10 6:26:31

嵌入式系统设计师软考个人笔记<3>

1.1 嵌入式系统电源管理1.1.1 电源系统基础定义&#xff1a;为嵌入式设备提供稳定、合规直流电能的子系统&#xff0c;通常将交流市电或电池电源转换为系统所需的直流电压等级。供电类型&#xff1a;市电供电&#xff1a;通过AC-DC转换模块&#xff08;如开关电源&#xff09;提…

作者头像 李华
网站建设 2026/6/10 10:24:39

解码内部集成电路(IIC)与OLED屏

内部集成电路&#xff08;IIC/I2C&#xff09; 基本概念 英文全称Inter Integrated Circuit&#xff0c;简称IIC或I2C&#xff0c;是半双工同步串行通信接口协议1982年由飞利浦公司&#xff08;现恩智浦半导体&#xff09;设计推出设计初衷&#xff1a;为微控制器&#xff08;…

作者头像 李华
网站建设 2026/6/10 10:26:21

稳定细胞系构建 | 稳定株开发服务 | 高表达克隆筛选

稳定细胞系构建是细胞生物学、分子生物学和蛋白质工程等众多科研领域中广泛采用的一项基础技术。所谓稳定细胞系&#xff0c;是指通过遗传整合外源基因的方式&#xff0c;使细胞在长期传代过程中持续稳定表达目标蛋白&#xff08;或其它功能元件&#xff09;的细胞系。这类细胞…

作者头像 李华