当前位置: 首页 > news >正文

考研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;}
http://www.jsqmd.com/news/304536/

相关文章:

  • 太阳敏感器的高精度补偿标定方法
  • 鼎先电子提供200多款从单通道到多通道的ESD防护器件,快充ESD解决方案
  • 大功率防雷器件,低容集成阵列TVS
  • SOD-523二极管提供1线ESD保护(单向和双向)。这些器件符合IEC 61000-4-2标准DC0501D5 DC0521D5
  • 7个 Golang 官方文档没细说的高效技巧
  • 代码通胀时代,AI生成的代码需要 12 倍审查成本?
  • c++ release下的debug
  • ssl免费证书与收费证书有什么区别
  • 应用程序嵌入插件需要具备什么条件
  • 给一个应用程序编写插件工作指南
  • 如何在应用程序中安装插件并使用
  • 当蝗虫玩起了概率游戏:HCUGOA的整活现场
  • Spring Boot 项目使用 EasyExcel 实现导出功能
  • 人群仿真软件:Vadere_(11).Vadere与其他仿真软件的比较
  • [Web自动化] 处理爬虫异常
  • [Web自动化] 爬虫之网络请求
  • 国产CAD这笔软件授权费,省得有点心疼
  • 导师严选10个AI论文平台,助研究生轻松搞定论文写作!
  • 国产CAD仿真分析,把破坏性试验留在屏幕里
  • 一口气看懂!多模态大模型是个啥?能帮我们干啥?
  • 给服务器起个“网名叫啥“?聊聊云服务器域名那些事儿
  • 一只蒟蒻的florr前期攻略(随本人更新,具有较强的真实性)
  • 广东视频号广告代理:厚拓科技11年深耕,赋能华南企业短视频营销新增长
  • 2026年 焊管机/焊管机组/高频焊管设备厂家实力推荐榜:方管机与镀锌方管机组等核心设备专业解析与选购指南
  • 结束数据的“马拉松”,开启决策的“实时模式”
  • Java计算机毕设之基于springboot的电器小家电机器人健康预警系统(完整前后端代码+说明文档+LW,调试定制等)
  • 意欧斯携手 SAP Business One 赋能生产制造企业数字化转型
  • 【课程设计/毕业设计】基于SpringBoot与Vue的机器人健康预警系统设计与实现基于springboot的机器人健康预警系统【附源码、数据库、万字文档】
  • langGraph从入门到精通(十一)——基于langgraph构建复杂工具应用的ReAct自治代理
  • 新手优化跨网络 DNS 解析速度全攻略