赞
踩
题目来自于博主算法大师的专栏:最新华为OD机试C卷+AB卷+OJ(C++JavaJSPy) https://blog.csdn.net/banxia_frontend/category_12225173.html
有位客人来自异国,在该国使用m进制计数。该客人有个幸运数字n(n<m),每次购物时,其总是喜欢计算本次支付的花费(折算为异国的价格后)中存在多少幸运数字。问:当其购买一个在我国价值k的产品时,其中包含多少幸运数字?
第一行输入为 k, n, m。
其中:
输出幸运数字的个数,行末无空格。当输入非法内容时,输出0
输入:
10 2 4
输出:
2
说明:
10用4进制表示时为22,同时,异国客人的幸运数字是2,故而此处输出为2,表示有2个幸运数字。
输入:
10 4 4
输出:
0
说明:
此时客人的幸运数字为4,但是由于该国最大为4进制,故而在该国的进制下不可能出现幸运数字,故而返回0
将十进制数13转换为四进制数的步骤可以按照“除4取余,逆序排列”的方法来进行:
将得到的余数从下往上进行排列(与二进制转换类似):
所以,十进制数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
。初始化计数器:设置一个变量count
用于记录在转换后的 m 进制数中出现幸运数字 n 的次数,初始值为0。
循环处理:使用 while 循环对物品价格 k 进行处理,每次循环将 k 对 m 进行取余操作,判断余数是否等于幸运数字 n。如果相等,则说明找到了一个幸运数字,将计数器 count 加1。然后将 k 除以 m 向下取整,继续进行下一轮循环,直到 k 变为0为止。
输出结果:当循环结束后,输出计数器 count 的值,即为物品价格 k 在 m 进制下包含的幸运数字 n 的个数。
程序返回:最后,程序返回0,表示正常结束。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。