返回目录

题目描述

有位客人来自异国,在该国使用 m 进制计数。

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

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

输入描述

第一行输入为 k,n,m。

其中:

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

输出描述

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

备注

当输入非法内容时,输出0

示例:

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

题目解析

这道题有点歧义。

比如异国的进制 m = 16,而异国客人的幸运数 n = 5,

那么如果十进制数 k 转成 m 进制后,如下:

1515151515

那么本次支付的花费(折算为异国的价格后)中存在多少幸运数字呢?

  1. 如果异国客人是按照 m进制的 “位值” 来对比幸运数 n 的话,那么上面情况存在 0 个幸运数数,因为 15 != 5。
  2. 如果异国客人是从 “m进制字符串” 中找幸运数n的话,那么存在5个幸运数,即在字符串"1515151515"中找幸运数5的出现次数。

本题题目描述和给的用例都无法解释上面问题。因此,这里我给出两种实现。

Python算法源码

def get_result(k, n, m):
    # 如果幸运数 >= 进制基数,比如 m=2 进制,要找 n >= 2 的幸运数,那么肯定是没有的
    if n >= m:
        return 0

    count = 0

    # 除留取余
    while k > 0:
        remain = k % m  # 余数就是 m 进制的每一位上“位值”

        # 按照 m 进制的“位值”来对比幸运数 n
        if remain == n:
            count += 1

        k //= m

    return count

# 输入处理
if __name__ == "__main__":
    k, n, m = map(int, input().split())
    print(get_result(k, n, m))

C算法源码

#include <stdio.h>

// 计算幸运数的个数
int get_result(long k, long n, long m) {
    // 如果幸运数 >= 进制基数,比如 m=2 进制,要找 n >= 2 的幸运数,那么肯定是没有的
    if (n >= m) {
        return 0;
    }

    int count = 0;

    // 除留取余
    while (k > 0) {
        long remain = k % m; // 余数就是 m 进制的每一位上“位值”

        // 按照 m 进制的“位值”来对比幸运数 n
        if (remain == n) {
            count++;
        }

        k = (k - remain) / m;
    }

    return count;
}

int main() {
    long k, n, m;
    scanf("%ld %ld %ld", &k, &n, &m);
    printf("%d\n", get_result(k, n, m));
    return 0;
}

Java算法源码

import java.util.Scanner;

public class Main {

    // 计算幸运数的个数
    public static int getResult(long k, long n, long m) {
        // 如果幸运数 >= 进制基数,比如 m=2 进制,要找 n >= 2 的幸运数,那么肯定是没有的
        if (n >= m) {
            return 0;
        }

        int count = 0;

        // 除留取余
        while (k > 0) {
            long remain = k % m; // 余数就是 m 进制的每一位上“位值”

            // 按照 m 进制的“位值”来对比幸运数 n
            if (remain == n) {
                count++;
            }

            k = (k - remain) / m;
        }

        return count;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        long k = sc.nextLong();
        long n = sc.nextLong();
        long m = sc.nextLong();

        System.out.println(getResult(k, n, m));
    }
}
最后修改:2024 年 04 月 04 日
如果觉得我的文章对你有用,请随意赞赏