华为OD机试 2024E卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
程序员小明打了一辆出租车去上班。出于职业敏感,他注意到这辆出租车的计费表有点问题,总是偏大.出租车司机解释说他不喜欢数字4,所以改装了计费表,任何数字位置遇到数字4就直接跳过,其余功能正常
比如:
1.23再多一块钱就变为25
2.39再多一块钱变为50;
3.399再多一块钱变为500;
小明识破了司机的伎俩,准备利用自己的学识打败司机的阴谋,给出计费表的表面读数,返回实际产生的费用
二、输入描述
输入一个数字N,表示里程表的读数。
三、输出描述
一个正整数,实际产生的费用。
四、测试用例
1、输入
15
2、输出
13
3、说明
15表示计费表的读数。
13表示实际产生的费用。
因为跳过了4和14。
五、解题思路
很简单的一道逻辑分析题。
六、Python算法源码
# 导入sys模块以读取输入
import sys
def main():
# 读取标准输入并转换为整数
input_num = int(sys.stdin.readline())
# 初始化sum为输入的数字
sum_val = input_num
# 初始化跳过的数量为0
skip = 0
# 初始化当前位置的数值为0
current = 0
# 初始化位数标识,开始为1(个位)
j = 1
# 当sum大于0时,继续循环
while sum_val > 0:
# 取sum的个位数字
digit = sum_val % 10
# 如果个位数字大于4
if digit > 4:
# 计算跳过的数量,考虑跳过包含数字4的情况
skip += (digit - 1) * current + j
else:
# 如果个位数字不大于4,直接计算跳过的数量
skip += digit * current
# 更新current,乘以9并加上当前位数
current = current * 9 + j
# 更新位数标识,乘以10
j *= 10
# 去掉最后一位数字,继续处理下一位
sum_val = sum_val // 10
# 输出最终结果,输入数减去跳过的数量
print(input_num - skip)
# 调用主函数
if __name__ == "__main__":
main()
七、JavaScript算法源码
// 定义主函数
function main() {
// 从标准输入读取数据
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin', 'utf8').trim();
// 将输入转换为整数
const inputNum = parseInt(input);
// 初始化sum为输入的数字
let sum = inputNum;
// 初始化跳过的数量为0
let skip = 0;
// 初始化当前位置的数值为0
let current = 0;
// 初始化位数标识,开始为1(个位)
let j = 1;
// 当sum大于0时,继续循环
while (sum > 0) {
// 取sum的个位数字
const digit = sum % 10;
// 如果个位数字大于4
if (digit > 4) {
// 计算跳过的数量,考虑跳过包含数字4的情况
skip += (digit - 1) * current + j;
} else {
// 如果个位数字不大于4,直接计算跳过的数量
skip += digit * current;
}
// 更新current,乘以9并加上当前位数
current = current * 9 + j;
// 更新位数标识,乘以10
j *= 10;
// 去掉最后一位数字,继续处理下一位
sum = Math.floor(sum / 10);
}
// 输出最终结果,输入数减去跳过的数量
console.log(inputNum - skip);
}
// 调用主函数
main();
八、C算法源码
#include <stdio.h>
// 主函数
int main() {
int input_num;
// 读取输入的整数
scanf("%d", &input_num);
// 初始化sum为输入的数字
int sum = input_num;
// 初始化跳过的数量为0
int skip = 0;
// 初始化当前位置的数值为0
int current = 0;
// 初始化位数标识,开始为1(个位)
int j = 1;
// 当sum大于0时,继续循环
while (sum > 0) {
// 取sum的个位数字
int digit = sum % 10;
// 如果个位数字大于4
if (digit > 4) {
// 计算跳过的数量,考虑跳过包含数字4的情况
skip += (digit - 1) * current + j;
} else {
// 如果个位数字不大于4,直接计算跳过的数量
skip += digit * current;
}
// 更新current,乘以9并加上当前位数
current = current * 9 + j;
// 更新位数标识,乘以10
j *= 10;
// 去掉最后一位数字,继续处理下一位
sum = sum / 10;
}
// 输出最终结果,输入数减去跳过的数量
printf("%d\n", input_num - skip);
return 0;
}
九、C++算法源码
#include <iostream>
using namespace std;
// 主函数
int main() {
int input_num;
// 读取输入的整数
cin >> input_num;
// 初始化sum为输入的数字
int sum = input_num;
// 初始化跳过的数量为0
int skip = 0;
// 初始化当前位置的数值为0
int current = 0;
// 初始化位数标识,开始为1(个位)
int j = 1;
// 当sum大于0时,继续循环
while (sum > 0) {
// 取sum的个位数字
int digit = sum % 10;
// 如果个位数字大于4
if (digit > 4) {
// 计算跳过的数量,考虑跳过包含数字4的情况
skip += (digit - 1) * current + j;
} else {
// 如果个位数字不大于4,直接计算跳过的数量
skip += digit * current;
}
// 更新current,乘以9并加上当前位数
current = current * 9 + j;
// 更新位数标识,乘以10
j *= 10;
// 去掉最后一位数字,继续处理下一位
sum = sum / 10;
}
// 输出最终结果,输入数减去跳过的数量
cout << (input_num - skip) << endl;
return 0;
}
🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)
🏆本文收录于,华为OD机试真题(Python/JS/C/C++)
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。