来自异国的客人/幸运数字(C语言)【进制转换】

文章讲述了如何解决一位使用m进制计数的异国客人在购物时计算其支付金额中幸运数字个数的问题,通过十进制转m进制的算法实现,并给出了两个示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目来自于博主算法大师的专栏:最新华为OD机试C卷+AB卷+OJ(C++JavaJSPy) https://blog.csdn.net/banxia_frontend/category_12225173.html

题目描述

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

输入描述

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

其中:

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

输出描述

输出幸运数字的个数,行末无空格。当输入非法内容时,输出0

用例1

输入:

10 2 4

输出:

2

说明:

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

用例2

输入:

10 4 4

输出:

0

说明:

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

解题思路

将十进制数13转换为四进制数的步骤可以按照“除4取余,逆序排列”的方法来进行:

  1. 用13除以4,商为3,余数为1。
  2. 再将商3除以4,商为0,余数为3。
  3. 由于商已经为0,转换结束。

将得到的余数从下往上进行排列(与二进制转换类似):

  • 第一次除法余数:1
  • 第二次除法余数:3

所以,十进制数13转换成四进制数是13(即1 * 4^1 + 3 * 4^0)。在四进制中,不使用前导零,直接写作(31)_4。

代码

#include <stdio.h>
#include <stdlib.h>

int main() {
    int k, n, m; // 定义变量 k 用于存储物品价格(十进制),n 存储幸运数字,m 存储异国进制
    scanf("%d %d %d", &k, &n, &m); // 输入物品价格、幸运数字和异国进制

    // 判断输入的有效性:价格和幸运数字不应小于0,且幸运数字必须小于进制数,进制数应大于1
    if (k < 0 || n < 0 || m <= 1 || n >= m) {
        printf("0"); // 若输入非法,则输出0
        return 0;
    }

    int count = 0; // 初始化幸运数字出现次数为0
    while (k > 0) { // 当物品价格转换后仍有剩余数值时
        if (k % m == n) { // 如果剩余数值对m取余等于幸运数字
            count++; // 增加幸运数字出现的计数
        }
        k /= m; // 将物品价格转换为对应进制下的一位数值
    }
    printf("%d", count); // 输出幸运数字出现的次数
    return 0; // 程序正常结束
}
  1. 读取输入:首先,通过 scanf 函数获取用户输入的三个整数参数,分别是物品价格(十进制表示)k、幸运数字n和异国采用的进制数m

  2. 验证输入合法性:检查输入值是否满足题目要求的条件。即:

    • 价格k和幸运数字n应当是非负数;
    • 进制数m必须大于1;
    • 幸运数字n必须小于进制数m
      如果输入非法,则输出0,并结束程序。
  3. 初始化计数器:设置一个变量count用于记录在转换后的 m 进制数中出现幸运数字 n 的次数,初始值为0。

  4. 循环处理:使用 while 循环对物品价格 k 进行处理,每次循环将 k 对 m 进行取余操作,判断余数是否等于幸运数字 n。如果相等,则说明找到了一个幸运数字,将计数器 count 加1。然后将 k 除以 m 向下取整,继续进行下一轮循环,直到 k 变为0为止。

  5. 输出结果:当循环结束后,输出计数器 count 的值,即为物品价格 k 在 m 进制下包含的幸运数字 n 的个数。

  6. 程序返回:最后,程序返回0,表示正常结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~柠月如风~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值