news 2026/9/13 2:44:45

考研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/12 21:57:46

国产CAD仿真分析,把破坏性试验留在屏幕里

搞研发的都知道&#xff0c;样机试制是个烧钱的无底洞。以前做一个新产品&#xff0c;设计好了直接加工出来&#xff0c;然后上试验台去测。有时候测到一半&#xff0c;结构崩了&#xff0c;几万块钱的样机瞬间变成废铁。心疼不说&#xff0c;还得分析是哪里出了问题&#xff0…

作者头像 李华
网站建设 2026/9/12 21:58:39

深度解析:2026年专业级AI公文写作软件如何选?附权威榜单

面对种类繁多的公文文种、严格的格式规范与严谨的内容要求,广大党政机关、事业单位及央国企的办公人员常常需要投入大量时间与精力。2026年,AI技术已深度融入办公场景,智能公文写作软件凭借其高效、准确、规范的核心优势,成为提升组织运转效能的重要工具。面对市场上众多选择,如…

作者头像 李华
网站建设 2026/9/12 19:45:21

one_channel_hub 移植到CH584M MCU平台(移除WiFi/网络相关代码)

one_channel_hub 移植到CH584M MCU平台&#xff08;移除WiFi/网络相关代码&#xff09; 一、移植前准备 1. 核心背景 CH584M特性&#xff1a;沁恒微的低功耗MCU&#xff0c;基于RISC-V架构&#xff0c;内置BLE 5.0&#xff0c;无WiFi外设&#xff0c;需适配其裸机/轻量级RTOS开…

作者头像 李华
网站建设 2026/9/11 22:11:14

JDK版本的区别

在IDEA中新建Spring Boot项目时&#xff0c;需要选择JDK版本&#xff0c;这里小记一下&#xff1a; Oracle OpenJDK Oracle 官方维护的开源免费JDK&#xff0c;Java标准实现。 Amazon Corretto 亚马逊基于 OpenJDK 定制的免费、长期支持JDK。 JetBrains Runtime JetBrains&…

作者头像 李华
网站建设 2026/9/12 21:57:54

2024年AI原生应用开源数据集推荐:高质量训练数据获取+处理全攻略

2024 年 AI 原生应用开源数据集推荐&#xff1a;高质量训练数据获取 处理全攻略 摘要/引言 在当今 AI 蓬勃发展的时代&#xff0c;高质量的数据集对于训练出强大且精准的 AI 原生应用至关重要。然而&#xff0c;如何获取合适的开源数据集&#xff0c;并对其进行有效的处理&a…

作者头像 李华
网站建设 2026/9/12 21:55:41

Java计算机毕设之基于Springboot+MySQ基于springboot的个人健康管理系统基于SpringBoot + Vue的个人运动健康管理系统(完整前后端代码+说明文档+LW,调试定制等)

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

作者头像 李华