(C卷,100分)- 来自异国的客人(Java & JS & Python & C)

题目描述

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

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

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

输入描述

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

其中:

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

输出描述

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

备注

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

用例

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

此时客人的幸运数字为4,但是由于该国最大为4进制,故而在该国的进制下不可能出现幸运数字,故而返回0。

题目解析

这道题有点歧义。

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

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

15 15 15 15 15

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

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

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


2023.01.18

根据考友反馈,下面解法:“按照 m进制的 “位值” 来对比幸运数 n”,可以拿100%通过率


2023.01.19

根据考友反馈,本题会出现超出int类型范围的用例数据,因此需要使用long类型

JS算法源码

按照 m进制的 “位值” 来对比幸运数 n
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

// 输入处理
void (async function () {
  const [k, n, m] = (await readline()).split(" ").map(Number);
  console.log(getResult(k, n, m));
})();

function getResult(k, n, m) {
  // 如果幸运数>=进制基数,比如m=2进制,要找n>=2的幸运数,那么肯定是没有的
  if (n >= m) return 0;

  let count = 0;

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

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

    k = (k - remain) / m;
  }

  return count;
}

Java算法源码

按照 m进制的 “位值” 来对比幸运数 n
import java.util.Scanner;

public class Main {

  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));
  }

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

    long count = 0;

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

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

      k /= m;
    }

    return count;
  }
}

Python算法源码

按照 m进制的 “位值” 来对比幸运数 n
# 输入获取
k, n, m = map(int, input().split())


# 算法入口
def getResult():
    global k

    # 如果幸运数>=进制基数,比如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


# 算法调用
print(getResult())

C算法源码

按照 m进制的 “位值” 来对比幸运数 n
#include <stdio.h>

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

    long count = 0;

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

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

        k /= m;
    }

    return count;
}

int main() {
    long k, n, m;
    scanf("%ld %ld %ld", &k, &n, &m);

    printf("%ldn", getResult(k, n, m));

    return 0;
}

免责声明:

1、IT资源小站为非营利性网站,全站所有资料仅供网友个人学习使用,禁止商用
2、本站所有文档、视频、书籍等资料均由网友分享,本站只负责收集不承担任何技术及版权问题
3、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除下载链接并致以最深的歉意
4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
5、一经注册为本站会员,一律视为同意网站规定,本站管理员及版主有权禁止违规用户
6、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和IT资源小站的同意
7、IT资源小站管理员和版主有权不事先通知发贴者而删除本文

0

评论0

站点公告

没有账号?注册  忘记密码?