一、题目

有位客人来自异国,在该国使用 m 进制计数。
该客人有个幸运数字n(n < m),每次购物时,其总是喜欢计算本次支付的花费(折算为异国的价格后)中存在多少幸运数字。

问:当其购买一个在我国价值 k 的产品时,其中包含多少幸运数字?

二、输入

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

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

三、输出

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

四、示例

输入:
10 2 4

输出:
2

五、题解

  1. 本题主要考察进制的转换;也可以参考编程语言自带的 API

5.1 Java 实现

package org.stone.study.algo.ex202411;

import java.util.Scanner;

public class DigitBaseConversion {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int k = scanner.nextInt(); // 购买的物品价值
        int n = scanner.nextInt(); // 幸运数字
        int m = scanner.nextInt(); // 进制

        if(n >= m) {
            // 参数异常
            return;
        }
        int ans = getLuckyNumberCnt2(k, n, m);
        System.out.println(ans);
    }

    /**
     * 求k的m进制表示中,数位上的数字n的个数。进制直接转换法
     * @param k
     * @param n
     * @param m
     * @return
     */
    private static int getLuckyNumberCnt(int k, int n, int m) {
        int cnt = 0;
        while(k != 0) {
            int digit = k % m;
            if(digit == n) {
                cnt++;
            }
            k = k / m;
        }

        return cnt;
    }

    /**
     * 通过转化为字符串求解
     * @param k
     * @param n
     * @param m
     * @return
     */
    private static int getLuckyNumberCnt2(int k, int n, int m) {
        String str = Integer.toString(k, m);
        String searchStr = String.valueOf(n);
        int pos = 0;
        int cnt = 0;
        while(pos != -1) {
            pos = str.indexOf(searchStr, pos);
            if(pos != -1) {
                cnt++;
                pos += searchStr.length();
            }
        }

        return cnt;
    }
}

5.2 Python实现

# 十进制 k 转换为 m 进制后,其中包含 n 的个数
def countLuckyNumber(k, n, m):
    cnt = 0
    while k != 0:
        if k % m == n:
            cnt += 1
        k //= m
    return cnt


if __name__ == "__main__":
    k, n, m = map(int, input().split())

    res = countLuckyNumber(k, n, m)

    print(res)