华为OD机试-来自异国的客人(Java 2024 D卷 100分)

题目描述

有位客人来自异国,在该国使用m进制计数。该客人有个幸运数字Qn(n<m),每次购物时,其总是喜欢计算本次支付的花费(折算为异国的价格后)中存在多少幸运数字。问:当其购买一个在我国价值k的产品时,其中包含多少幸运数字?

输入描述

第一行输入为k, n, m。其中:

  • k表示该客人购买的物品价值(以十进制计算的价格)
  • n表示该客人的幸运数字
  • m表示该客人所在国度的采用的进制

输出描述

输出幸运数字的个数,行末无空格。

示例

输入:

1024 2 4

输出:

2

说明:
10用4进制表示时为22,同时,异国客人的幸运数字是2,故而此处输出为2,表示有2个幸运数字。

解题思路

  1. 将十进制数k转换为m进制表示。
  2. 统计转换后的m进制数中幸运数字n出现的次数。

代码实现

Java
import java.util.Scanner;

public class LuckyNumberCount {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int k = scanner.nextInt();
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        
        String mBase = Integer.toString(k, m);
        int count = 0;
        for (char c : mBase.toCharArray()) {
            if (Character.getNumericValue(c) == n) {
                count++;
            }
        }
        
        System.out.println(count);
    }
}
Python
def count_lucky_numbers(k, n, m):
    m_base = ""
    while k > 0:
        m_base = str(k % m) + m_base
        k = k // m
    return m_base.count(str(n))

k, n, m = map(int, input().split())
print(count_lucky_numbers(k, n, m))
C++
#include <iostream>
#include <string>
using namespace std;

int countLuckyNumbers(int k, int n, int m) {
    string mBase = "";
    while (k > 0) {
        mBase = to_string(k % m) + mBase;
        k /= m;
    }
    int count = 0;
    for (char c : mBase) {
        if (c - '0' == n) {
            count++;
        }
    }
    return count;
}

int main() {
    int k, n, m;
    cin >> k >> n >> m;
    cout << countLuckyNumbers(k, n, m) << endl;
    return 0;
}
JavaScript
function countLuckyNumbers(k, n, m) {
    let mBase = "";
    while (k > 0) {
        mBase = (k % m).toString() + mBase;
        k = Math.floor(k / m);
    }
    return mBase.split('').filter(c => parseInt(c) === n).length;
}

const input = prompt("Enter k, n, m:").split(' ').map(Number);
const [k, n, m] = input;
console.log(countLuckyNumbers(k, n, m));

复杂度分析

  • 时间复杂度: O(log_m(k)),因为我们需要将k转换为m进制表示,这个过程的时间复杂度与k的位数成正比。
  • 空间复杂度: O(log_m(k)),用于存储转换后的m进制数。

总结

这道题目主要考察了进制转换和字符串处理的基本能力。通过将十进制数转换为m进制数,并统计其中幸运数字的出现次数,我们可以轻松解决这个问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

蓝白咖啡

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

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

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

打赏作者

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

抵扣说明:

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

余额充值