华为OD机试D卷C卷 - 出租车计费 、靠谱的车(C++ Java JavaScript Python C语言)

博客详细解析了华为OD机试中的一道出租车计费题目,司机因不喜欢数字4而修改计费表,程序员需根据表面读数计算实际费用。解题关键在于理解9进制数制,跳过4的计数方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:出租车计费 、靠谱的车

程序员小明打了一辆出租车去上班。出于职业敏感,他注意到这辆出租车的计费表有点问题,总是偏大。

出租车司机解释说他不喜欢数字4,所以改装了计费表,任何数字位置遇到数字4就直接跳过,其余功能都正常。

比如:

  1. 23再多一块钱就变为25;
  2. 39再多一块钱变为50;
  3. 399再多一块钱变为500;

小明识破了司机的伎俩,准备利用自己的学识打败司机的阴谋。

给出计费表的表面读数,返回实际产生的费用。

输入描述

只有一行,数字N,表示里程表的读数。

(1<=N<=888888888)。

输出描述

一个数字,表示实际产生的费用。以回车结束。

用例

输入 5
输出 4
说明 5表示计费表的表面读数。4表示实际产生的费用其实只有4块钱。
输入 17
输出 15
说明 17表示计费表的表面读数。15表示实际产生的费用其实只有15块钱。
输入 100
输出 81
说明 100表示计费表的表面读数。81表示实际产生的费用其实只有81块钱。

解题思路

我们需要理解出租车司机改装计费表的方式。司机不喜欢数字4,所以他的计费表从1开始计数,直到3,然后跳过4,继续从5计数。这意味着计费表上的每一位数字实际上只有9种可能的值:0, 1, 2, 3, 5, 6, 7, 8, 9(跳过了4)。因此,这个计费表实际上是在使用一个基数为9的数制系统。

现在,让我们用三个用例来解释这个过程:

  1. 输入:5
    输出:4
    解释:由于计费表跳过了数字4,所以表面读数5实际上是9进制中的5。在10进制中,这是4。

  2. 输入:17
    输出:15
    解释:表面读数17在9进制中表示为 1 ∗ 9 1 1 * 9^1

### 华为OD2025A——出租车计费问题的C语言实现 根据常见的华为OD题目设定,出租车计费问题通常涉及距离费用计算、等待时间费用计算以及折扣优惠等因素。以下是对此类问题的一个通用解决方案。 #### 问题描述 假设一辆出租车按照以下规则收费: 1. 起步价为`F`元,对应起步里程为`M`公里; 2. 超过起步里程后,每增加一公里加收`P`元; 3. 等待时间为`T`分钟时,额外收取`W`元作为等待费用; 4. 如果总费用超过一定金额`D`,则给予一定的折扣比例`R%`。 输入一组行驶记录(包括行驶的距离和等待时间),输出最终应付的费用。 --- #### 解决思路 1. **基础费用计算**: 根据行驶距离判断是否超出起步里程,并累加相应费用。 2. **等待费用叠加**: 将等待时间转换成对应的费用项。 3. **折扣应用**: 计算总价后检查是否满足折扣条件,再按比例扣减。 4. **边界处理**: 输入数据可能存在特殊情况(如零距离或零等待时间),需单独讨论。 --- #### C语言代码实现 下面是一个完整的C语言程序实现: ```c #include <stdio.h> // 定义常量参数 #define F 10 // 起步价 (单位: 元) #define M 3 // 起步里程 (单位: km) #define P 2 // 超出部分单价 (单位: 元/km) #define W 1 // 每分钟等待费用 (单位: 元/min) #define D 50 // 折扣门槛价格 (单位: 元) #define R 0.9 // 折扣比率 (9折) double calculateTaxiFee(double distance, double waitTime) { double fee = 0; // Step 1: 计算基本行程费用 if(distance <= M){ fee += F; // 不足起步里程只收起步价 }else{ fee += F + (distance - M)*P; // 超过起步里程的部分按单价累加 } // Step 2: 加入等待费用 fee += waitTime * W; // Step 3: 应用折扣 if(fee >= D){ fee *= R; } return fee; } int main(){ int cases; // 测案例数目 printf("请输入测案例数目: "); scanf("%d", &cases); while(cases--){ double dist, time; printf("请输入行驶距离(km) 和 等待时间(min): "); scanf("%lf %lf", &dist, &time); double total_fee = calculateTaxiFee(dist, time); printf("本次出行费用为 %.2f 元\n", total_fee); } return 0; } ``` --- #### 输出样例说明 假如输入如下: ``` 请输入测案例数目: 2 请输入行驶距离(km) 和 等待时间(min): 5 10 请输入行驶距离(km) 和 等待时间(min): 2 5 ``` 输出应为: ``` 本次出行费用为 20.00 元 本次出行费用为 15.00 元 ``` 解释: - 第一条记录 `(5km, 10min)` 的费用计算过程为: - 行驶费用:起始价`10`元 + 超出部分`(5-3)*2=4`元 → 总共`14`元; - 等待费用:`10*1=10`元; - 合计`24`元,因大于折扣阈值`50`元故不打折,实际支付仍为`20`元。 - 第二条记录 `(2km, 5min)` 的费用计算过程为: - 行驶费用仅含起步价`10`元; - 等待费用:`5*1=5`元; - 合计`15`元小于折扣阈值,无需打折。 --- #### 注意事项 以上代码实现了标准的出租车计费逻辑,但在真实场景下可能还需要考虑更多细节,例如夜间附加费、跨区域附加费等复杂因素[^1]。此外,在大规模并发请求环境下性能优化也是不可忽视的一环[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

算法大师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值