C语言入门算法——车站

题目描述:

火车从始发站(称为第 1 站)开出,在始发站上车的人数为 a,然后到达第 2 站,在第 2 站有人上、下车,但上、下车的人数相同,因此在第 2 站开出时(即在到达第 3 站之前)车上的人数保持为 a 人。从第 3 站起(包括第 3 站)上、下车的人数有一定规律:上车的人数都是前两站上车人数之和,而下车人数等于上一站上车人数,一直到终点站的前一站(第 n−1 站),都满足此规律。现给出的条件是:共有 n 个车站,始发站上车的人数为 a,最后一站下车的人数是 m(全部下车)。试问 x 站开出时车上的人数是多少?

输入格式

输入只有一行四个整数,分别表示始发站上车人数 a,车站数 n,终点站下车人数 m 和所求的站点编号 x。

输出格式

输出一行一个整数表示答案:从 x 站开出时车上的人数。

输入输出样例

输入 #1

5 7 32 4

输出 #1

13

说明/提示

对于全部的测试点,保证 1≤a≤20,1≤x≤n≤20,1≤m≤2×10^4。

题目来源

P1011 [NOIP1998 提高组] 车站

思路及部分代码:

1. 根据第二站上车人数,算出终点站下车人数

//按照固定规律计算最后一站下车人数
int station(int a,int n, int test){//如果是前两站为终点if(n == 1 || n==2) return a;int car_people_number = a;      //最初车上人数int people_number[2]={a,test};   //记录三站上车人数for(int i=3;i < n ;i++){         //到n-1站结束//更新车上人数car_people_number = car_people_number + people_number[0] ;//更新上车人数int TS =  people_number[1];people_number[1] = people_number[0] + people_number[1];people_number[0] = TS;}//printf("car_people_number = %d\r\n",car_people_number);return car_people_number;   //返回最终车上人数
}

2. 根据a,n,m求出第二站的上车人数

//判断第二站上次人数
int two_people(int a,int n,int m){int i=0;while(1){if(m == station(a,n,i)){//printf("two = %d\r\n",i);return i;}i++;//超出数据if(i >= 2*10000) return -1;}
}

3.代码整合

        以上两个函数可以计算第二站的上车人数,而第一个函数可以根据输入的车站数量n计算车上的总人数。同样的逻辑也可以用于完成题目要求。

int main (){int a,n,m,x;scanf("%d %d %d %d",&a,&n,&m,&x);//输出题目要求的下车数int two = two_people(a,n,m);printf("%d\r\n",station(a,x+1,two));return 0;
}

总代码:

#include <stdio.h>//按照固定规律计算最后一站下车人数
int station(int a,int n, int test){//如果是前两站为终点if(n == 1 || n==2) return a;int car_people_number = a;      //最初车上人数int people_number[2]={a,test};   //记录三站上车人数for(int i=3;i < n ;i++){         //到n-1站结束//更新车上人数car_people_number = car_people_number + people_number[0] ;//更新上车人数int TS =  people_number[1];people_number[1] = people_number[0] + people_number[1];people_number[0] = TS;}//printf("car_people_number = %d\r\n",car_people_number);return car_people_number;   //返回最终车上人数
}//判断第二站上次人数
int two_people(int a,int n,int m){int i=0;while(1){if(m == station(a,n,i)){//printf("two = %d\r\n",i);return i;}i++;//超出数据if(i >= 2*10000) return -1;}}int main (){int a,n,m,x;scanf("%d %d %d %d",&a,&n,&m,&x);//输出题目要求的下车数int two = two_people(a,n,m);printf("%d\r\n",station(a,x+1,two));return 0;
}

总结:

        程序的主要目的是计算一个公交车上乘客的人数变化,并根据输入的条件来确定最后一站的下车人数。程序的基本逻辑是模拟了公交车途经若干站后的人数变化过程,并通过函数 station 计算每一站的乘客人数,然后通过 two_people 函数来确定第二站的上车人数。

不足之处:

  1. two_people 函数中的 while 循环没有合适的退出条件,限制 i 的最大值为 2*10000 也不是一个很好的做法。应该考虑使用更有效的搜索方法,避免不必要的循环次数。

  2. 程序中缺少注释,特别是对于一些关键函数的作用和参数含义,应该添加更多的注释以提高代码的可读性。

  3. 变量命名可以更具有描述性,以便于他人理解代码的意图。

  4. 程序中没有对输入参数进行有效性检查和边界情况处理,例如输入的站数 n、查询的站数 x 等应该做合理性判断,以避免潜在的错误或异常情况。

改进建议:

  1. 在 two_people 函数中,使用更有效的搜索方法来确定第二站的上车人数 m 对应的位置 i

  2. 在 two_people 函数中,添加合适的退出条件,避免不必要的循环次数。

  3. 在程序中添加更多的注释,特别是对于一些关键函数的作用和参数含义,以提高代码的可读性。

  4. 变量命名应该更具有描述性,以便于他人理解代码的意图。

  5. 对输入参数进行有效性检查和边界情况处理,例如输入的站数 n、查询的站数 x 等应该做合理性判断,以避免潜在的错误或异常情况。

  6. 考虑使用更高效的算法来解决问题,例如在 two_people 函数中可以使用更快速的查找方法来确定第二站的上车人数 m 对应的位置 i

  7. 在程序中加入更多的错误处理机制,例如对于无法找到满足条件的 i 值的情况应该有合适的异常处理或返回值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/815580.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[C语言][数据结构][链表] 双链表的从零实现!

目录 零.必备知识 0.1 一级指针 && 二级指针 0.2 双链表节点的成员列表 a. 数据 b. 后驱指针 c. 前驱指针 0.3 动态内存空间的开辟 一. 双链表的实现与销毁 1.1 节点的定义 1.2 双向链表的初始化 && 创建新节点 1.3 尾插 1.4 头插 1.5 尾删 1.6 头删 1…

MySQL8.0.36-社区版:错误日志(2)

mysql有个错误日志&#xff0c;是专门记录错误信息的&#xff0c;这个功能默认是开启的 一般都是在/var/log/mysqld.log 日志中存放 1.错误日志的位置 首先我们使用命令去查看一下&#xff0c;这个错误日志文件究竟在哪 进入到mysql中&#xff0c;使用命令 show variables…

题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。

题目&#xff1a;输入数组&#xff0c;最大的与第一个元素交换&#xff0c;最小的与最后一个元素交换&#xff0c;输出数组。 There is no nutrition in the blog content. After reading it, you will not only suffer from malnutrition, but also impotence. The blog conte…

二叉树遍历(前序创建|中序遍历)

牛客题目链接 目录 1.解题思路 1.1中序遍历打印 ​1.2前序创建二叉树 1.3注意点 博主这里用的是java实现 随手记一个知识: hasNext读取到空格或者换行符会结束 hasNextLine读取到换行符才会结束&#xff08;空格不会退出&#xff09; 为什么要强调这个呢&#xff1f; …

Vivado Design Suite中的增量实现和增量模式

Vivado Incremental&#xff08;增量&#xff09;是Xilinx FPGA设计工具中的一种功能&#xff0c;它允许对设计的一部分进行修改和重新编译&#xff0c;而不需要对整个设计进行重新编译。这种增量式的方法可以显著减少编译时间&#xff0c;特别是在进行小的修改或迭代开发时。 …

std::stringstream

std::stringstream 是 C 标准库中的一个类&#xff0c;用于对字符串进行输入输出操作&#xff0c;类似于文件流&#xff08;std::ifstream 和 std::ofstream&#xff09;。它允许你像使用 std::cin 和 std::cout 一样使用字符串。 std::stringstream 可以将字符串作为输入源&am…

ThreadPoolExecutor线程池解析

ThreadPoolExecutor线程池解析 一、ThreadPoolExecutor常见参数 jdk中Executors提供了几种常用的线程池&#xff0c;底层都是ThreadPoolExecutor。 public ThreadPoolExecutor(int corePoolSize,//核心线程数int maximumPoolSize,// 最大线程数long keepAliveTime,//非核心线程…

大数据产品有哪些分类?各类里知名大数据产品都有哪些?

随着互联网技术的持续进步和全球数字化转型的推进&#xff0c;我们正处于一个数据爆炸的时代。在这样的大背景下&#xff0c;大数据已经逐渐崭露头角&#xff0c;成为了推动各行各业发展的关键因素和核心资源。大数据不仅仅是指数据的规模巨大&#xff0c;更重要的是它蕴含的价…

安卓手机APP开发的媒体内容部分__重中之重的内容变现渠道___插入广告

安卓手机APP开发的媒体内容部分__重中之重的内容变现渠道___插入广告 目录 客户端的插入广告 声明式的广告的支持 有广告的播放列表 ExoPlayer IMA库 用户界面上的考虑 伴随广告 独立广告 使用第三方的广告SDK 服务器端的插入广告 ExoPlayer IMA库 用户界面上的考虑…

spring-aop的使用(注解 +配置类的方式)(多个增强类的优先级问题)

spring-aop 首先&#xff0c;准备一个接口以及其实现类 Calculator接口&#xff1a;src/main/java/com.atguigu.service/Calculator接口 package com.atguigu.service;public interface Calculator {int add(int i, int j);int sub(int i, int j);int mul(int i, int j);int…

docker 容器指定utf-8编码

在运行 Docker 容器的时候&#xff0c;如果容器内应用需要使用 UTF-8 编码来正常处理中文&#xff0c;你可以通过设置环境变量来指定编码。 可以使用 -e 或者 --env 标志来设置环境变量。比如&#xff0c;设置 LANG 和 LC_ALL 环境变量为 C.UTF-8 或者 en_US.UTF-8&#xff1a…

量子信息产业生态研究(一):关于《量子技术公司营销指南(2023)》的讨论

写在前面。量子行业媒体量子内参&#xff08;Quantum Insider&#xff09;编制的《量子技术公司营销指南》是一本实用的英文手册&#xff0c;它旨在帮助量子科技公司建立有效的营销策略&#xff0c;同时了解如何将自己定位成各自的行业专家。本文对这篇指南的主要内容进行了翻译…

ubuntu上安装截图工具-Flameshot及其使用步骤说明

Flameshot 火焰截图-推荐 安装命令&#xff1a; sudo apt install flameshot 操作方式&#xff1a; 1&#xff09;打开 2&#xff09;右上角弹窗 3&#xff09;点击后弹出 选择进行截图 4&#xff09;截图后再选择分享 5&#xff09;再重新选择区域&#xff0c;出现编辑…

【蓝桥杯】2024年第15届真题题目

试题 A: 握手问题 本题总分&#xff1a; 5 分 【问题描述】 小蓝组织了一场算法交流会议&#xff0c;总共有 50 人参加了本次会议。在会议上&#xff0c; 大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进 行一次握手&#xff08;且仅有一次&a…

Android bug Unresolved reference: BR

新建项目后 导入viewBinding 编译后提示 Unresolved reference: BR 解决办法 app 目录下 build.gradle 中 plugins 节点 添加 id kotlin-kapt参考 https://stackoverflow.com/questions/77409050/could-not-find-androidx-corecore-ktx1-8-10

npm包管理工具升降级

一、npm降级 1.接大版本号&#xff0c;降级到大版本最新的小版本 npm install npm5 -g 2.接指定版本号 npm install npm5.01.01 -g 二、npm升级 升级到最新版本 npm install npm -g 详细参考&#xff1a;nodejs与npm版本对应关系以及使用nvm管理node版本以及降npm版本-CSDN博…

CMD 汉字乱码处理

windows 11 cmd汉字乱码问题处理 一 查看CMD编码 win R 输入 cmd 输入 chcp 查看回显信息 “936”代表的意思就是 GBK (汉字内码扩展规范)&#xff0c;通常情况下GBK也是cmd的默认编码。 解决乱码需要把编码改为 utf-8 二 临时修改 在 终端中输入 chcp 65001 三 永久修改…

蓝桥杯嵌入式第十五届省赛真题题目

蓝桥杯昨天也考完了&#xff0c;大家可以看看题目 客观题题目 程序题题目

【复读EffectiveC++17】条款17:以独立语句将newed对象置入智能指针

条款17&#xff1a;以独立语句将newed对象置入智能指针 此条款&#xff0c;依然是针对智能指针的补充&#xff0c;内容分为两个部分&#xff1a; 有什么问题怎么解决 一、有什么问题 取原书的例子&#xff1a; 写一个函数&#xff0c;用来揭示程序处理的优先权。 再写一个函…

Opencv图像 ROI 与 mask 掩膜(找到感兴趣的区域)

在OpenCV中&#xff0c;可以使用ROI&#xff08;Region of Interest&#xff09;技术来处理图像中的感兴趣区域。ROI是指图像中的一个子区域&#xff0c;它可以是矩形、多边形或其他形状。使用ROI技术可以在不影响图像其他部分的情况下&#xff0c;对图像的某个区域进行操作。 …