题目来自于博主算法大师的专栏:最新华为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取余,逆序排列”的方法来进行:
- 用13除以4,商为3,余数为1。
- 再将商3除以4,商为0,余数为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; // 程序正常结束
}
-
读取输入:首先,通过
scanf
函数获取用户输入的三个整数参数,分别是物品价格(十进制表示)k
、幸运数字n
和异国采用的进制数m
。 -
验证输入合法性:检查输入值是否满足题目要求的条件。即:
- 价格
k
和幸运数字n
应当是非负数; - 进制数
m
必须大于1; - 幸运数字
n
必须小于进制数m
。
如果输入非法,则输出0,并结束程序。
- 价格
-
初始化计数器:设置一个变量
count
用于记录在转换后的 m 进制数中出现幸运数字 n 的次数,初始值为0。 -
循环处理:使用 while 循环对物品价格 k 进行处理,每次循环将 k 对 m 进行取余操作,判断余数是否等于幸运数字 n。如果相等,则说明找到了一个幸运数字,将计数器 count 加1。然后将 k 除以 m 向下取整,继续进行下一轮循环,直到 k 变为0为止。
-
输出结果:当循环结束后,输出计数器 count 的值,即为物品价格 k 在 m 进制下包含的幸运数字 n 的个数。
-
程序返回:最后,程序返回0,表示正常结束。