news 2026/9/11 5:05:02

考研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/9/3 5:28:08

​​​​​​​刷爆朋友圈的“香蕉模型”,到底是什么来头?

关注我们 最近AI圈子又变天了 大家都在讨论一个新词 叫做香蕉模型 你可能第一次听说 但在极客圈它已经杀疯了 为什么叫它香蕉 因为它主打的就是 剥皮即食 简单好用且能量巨大 相比于那些庞大的巨无霸模型 香蕉模型更轻量 反应速度更快 而且成本低到令人发指 很多做…

作者头像 李华
网站建设 2026/8/30 16:27:20

[Web自动化] 爬虫之网络请求

9.4 爬虫之网络请求 9.4.1 使用requests库发送HTTP请求 requests库提供了丰富的功能来发送HTTP请求&#xff0c;并处理响应。以下是一些额外的示例和说明。 发送带参数的GET请求&#xff1a; 如果你需要向服务器发送查询参数&#xff0c;可以将它们作为字典传递给params参数。 …

作者头像 李华
网站建设 2026/9/3 1:16:51

08.05.01.tiptop webserver接口篇(制作接口:自定义查询)

本页目录&#xff1a; 1、写代码2、配置3、测试 写代码 修改注册服务接口代码&#xff1a;/u1/topprod/tiptop/aws/4gl/aws_ttsrv2_service.4gl 添加發佈 Service Function 段落 ----------------------- begin waichi001 --------------WHEN "aws_customizeQueryData&…

作者头像 李华
网站建设 2026/9/3 2:47:07

05. 如何实现原理图比较?| OrCAD X Capture CIS 设计小诀窍第二季

OrCAD X Capture CIS设计小诀窍系列--如何实现原理图比较背景介绍&#xff1a;我们在进行原理图设计时&#xff0c;经常需要对原理图进行版本更新。而如果设计师对最新版本的原理图不满意&#xff0c;想要回溯原理图修改了哪些内容&#xff0c;则需要进行原理图比较。而通过Cap…

作者头像 李华
网站建设 2026/9/3 10:37:24

Spring Boot的多环境配置

在开发Spring Boot项目中&#xff0c;如果我们想把自己的项目开源到Github仓库&#xff0c;application.yml中的某些配置比如MySQL、Redis的账户密码&#xff0c;还有的就是现在引入AI之后的一些密钥&#xff0c;可能都不太愿意推送到仓库去。 这个时候&#xff0c;可以通过配…

作者头像 李华
网站建设 2026/8/21 19:19:25

【双指针】判断是否为回文字符串

求解代码 public boolean judge(String str) {int n str.length(); // 获取字符串长度&#xff0c;用于定义右指针初始位置// 双指针遍历for (int i 0, j n - 1; i < j; i, j--) {// 逐位对比首尾字符&#xff0c;只要有一位不一致&#xff0c;直接判定不是回文if (str.c…

作者头像 李华