一、题目 §
有位客人来自异国,在该国使用 m 进制计数。
该客人有个幸运数字n(n < m),每次购物时,其总是喜欢计算本次支付的花费(折算为异国的价格后)中存在多少幸运数字。
问:当其购买一个在我国价值 k 的产品时,其中包含多少幸运数字?
二、输入 §
第一行输入为 k,n,m。其中:
k 表示该客人购买的物品价值(以十进制计算的价格)
n 表示该客人的幸运数字
m 表示该客人所在国度采用的进制
三、输出 §
输出幸运数字的个数,行末无空格
四、示例 §
输入:
10 2 4
输出:
2
五、题解 §
- 本题主要考察进制的转换;也可以参考编程语言自带的 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)