
华为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在线答疑。




















