华为OD机试 2024E卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
有位客人来自异国,在该国使用m进制计数。
该客人有个幸运数字n(n<m),每次购物时,其总是喜欢计算本次支付的花费(折算为异国的价格后)中存在多少幸运数字。
问: 当其购买一个在我国价值k的产品时,其中包含多少幸运数字?
二、输入描述
第一行输入为 k,n,m。其中:
k 表示 该客人购买的物品价值 (以十进制计算的价格)
n 表示该客人的幸运数字
m 表示 该客人所在国度的采用的进制
三、输出描述
输出幸运数字的个数,行未无空格。
四、测试用例
1、输入
10 2 4
2、输出
2
3、说明
10用4进制表示时为22,同时,异国客人的幸运数字是2,故而此处输出为2,表示有2个幸运数字。
4、输入
10 4 4
5、输出
0
6、说明
此时客人的幸运数字为4,但是由于该国最大为4进制,故而在该国的进制下不可能出现幸运数字,故而返回0
五、解题思路
我们需要将十进制数 k 转换为 m 进制,然后统计其中等于幸运数字 n 的个数。具体步骤如下:
- 将十进制数 k 转换为 m 进制:
- 使用除基取余法,直到 k 为0,将每次的余数记录下来。
- 将记录的余数反向排列,即为 m 进制表示。
- 统计幸运数字的个数:
- 遍历 m 进制表示的数字,统计其中等于 n 的数字个数。
- 输出结果:输出幸运数字的个数。
六、Python算法源码
def convert_to_base_m(k, m):
"""将十进制数 k 转换为 m 进制表示"""
if k == 0:
return "0"
m_base_number = []
while k > 0:
remainder = k % m
m_base_number.append(str(remainder))
k //= m
m_base_number.reverse()
return ''.join(m_base_number)
def count_lucky_numbers(m_base_number, n):
"""统计 m 进制表示中幸运数字 n 的个数"""
lucky_digit = str(n)
return m_base_number.count(lucky_digit)
def main():
# 读取输入的 k, n, m
k = int(input("请输入 k: "))
n = int(input("请输入 n: "))
m = int(input("请输入 m: "))
# 将十进制数 k 转换为 m 进制
m_base_number = convert_to_base_m(k, m)
# 统计幸运数字 n 的个数
lucky_number_count = count_lucky_numbers(m_base_number, n)
# 输出结果
print(lucky_number_count)
if __name__ == "__main__":
main()
七、JavaScript算法源码
function convertToBaseM(k, m) {
// 将十进制数 k 转换为 m 进制表示
let mBaseNumber = '';
if (k === 0) return '0';
while (k > 0) {
let remainder = k % m;
mBaseNumber = remainder.toString() + mBaseNumber;
k = Math.floor(k / m);
}
return mBaseNumber;
}
function countLuckyNumbers(mBaseNumber, n) {
// 统计 m 进制表示中幸运数字 n 的个数
let count = 0;
let luckyDigit = n.toString();
for (let digit of mBaseNumber) {
if (digit === luckyDigit) {
count++;
}
}
return count;
}
function main() {
// 读取输入的 k, n, m
let k = parseInt(prompt("请输入 k: "));
let n = parseInt(prompt("请输入 n: "));
let m = parseInt(prompt("请输入 m: "));
// 将十进制数 k 转换为 m 进制
let mBaseNumber = convertToBaseM(k, m);
// 统计幸运数字 n 的个数
let luckyNumberCount = countLuckyNumbers(mBaseNumber, n);
// 输出结果
console.log(luckyNumberCount);
}
// 调用主函数执行程序
main();
八、C算法源码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 将十进制数 k 转换为 m 进制表示
void convertToBaseM(int k, int m, char *mBaseNumber) {
int index = 0;
if (k == 0) {
mBaseNumber[index++] = '0';
mBaseNumber[index] = '\0';
return;
}
while (k > 0) {
int remainder = k % m;
mBaseNumber[index++] = remainder + '0'; // 将数字转换为字符
k /= m;
}
mBaseNumber[index] = '\0';
// 反转字符串
int len = strlen(mBaseNumber);
for (int i = 0; i < len / 2; i++) {
char temp = mBaseNumber[i];
mBaseNumber[i] = mBaseNumber[len - 1 - i];
mBaseNumber[len - 1 - i] = temp;
}
}
// 统计 m 进制表示中幸运数字 n 的个数
int countLuckyNumbers(char *mBaseNumber, int n) {
int count = 0;
char luckyDigit = n + '0';
for (int i = 0; mBaseNumber[i] != '\0'; i++) {
if (mBaseNumber[i] == luckyDigit) {
count++;
}
}
return count;
}
int main() {
int k, n, m;
// 读取输入的 k, n, m
printf("请输入 k: ");
scanf("%d", &k);
printf("请输入 n: ");
scanf("%d", &n);
printf("请输入 m: ");
scanf("%d", &m);
// 定义一个足够大的字符数组来存储 m 进制表示的数字
char mBaseNumber[65];
// 将十进制数 k 转换为 m 进制
convertToBaseM(k, m, mBaseNumber);
// 统计幸运数字 n 的个数
int luckyNumberCount = countLuckyNumbers(mBaseNumber, n);
// 输出结果
printf("%d\n", luckyNumberCount);
return 0;
}
九、C++算法源码
#include <iostream>
#include <string>
#include <algorithm>
// 将十进制数 k 转换为 m 进制表示
std::string convertToBaseM(int k, int m) {
std::string mBaseNumber;
if (k == 0) {
return "0";
}
while (k > 0) {
int remainder = k % m;
mBaseNumber += std::to_string(remainder);
k /= m;
}
std::reverse(mBaseNumber.begin(), mBaseNumber.end());
return mBaseNumber;
}
// 统计 m 进制表示中幸运数字 n 的个数
int countLuckyNumbers(const std::string& mBaseNumber, int n) {
char luckyDigit = '0' + n;
int count = 0;
for (char digit : mBaseNumber) {
if (digit == luckyDigit) {
count++;
}
}
return count;
}
int main() {
int k, n, m;
// 读取输入的 k, n, m
std::cout << "请输入 k: ";
std::cin >> k;
std::cout << "请输入 n: ";
std::cin >> n;
std::cout << "请输入 m: ";
std::cin >> m;
// 将十进制数 k 转换为 m 进制
std::string mBaseNumber = convertToBaseM(k, m);
// 统计幸运数字 n 的个数
int luckyNumberCount = countLuckyNumbers(mBaseNumber, n);
// 输出结果
std::cout << luckyNumberCount << std::endl;
return 0;
}
🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)
🏆本文收录于,华为OD机试真题(Python/JS/C/C++)
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。