题目描述
有位客人来自异国,在该国使用m进制计数。该客人有个幸运数字Qn(n<m),每次购物时,其总是喜欢计算本次支付的花费(折算为异国的价格后)中存在多少幸运数字。问:当其购买一个在我国价值k的产品时,其中包含多少幸运数字?
输入描述
第一行输入为k, n, m。其中:
- k表示该客人购买的物品价值(以十进制计算的价格)
- n表示该客人的幸运数字
- m表示该客人所在国度的采用的进制
输出描述
输出幸运数字的个数,行末无空格。
示例
输入:
1024 2 4
输出:
2
说明:
10用4进制表示时为22,同时,异国客人的幸运数字是2,故而此处输出为2,表示有2个幸运数字。
解题思路
- 将十进制数k转换为m进制表示。
- 统计转换后的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进制数,并统计其中幸运数字的出现次数,我们可以轻松解决这个问题。