1 条题解
-
1
题意分析
题目要求找出在给定区间内最大的整数,使得在基数下的数字表示与在基数下的数字表示完全相同,其中是某个正整数。本质上是要寻找满足特定进制转换关系的数字。
解题思路
- 进制转换:对于每个候选数字,将其从进制转换为进制表示的数字值。
- 倍数验证:检查转换后的数值是否能被整除,即是否存在整数满足条件。
- 区间搜索:在给定区间内从大到小搜索满足条件的最大。
实现步骤
- 输入处理:读取测试用例数量和各个测试参数。
- 候选数字遍历:对每个测试用例,在区间内遍历数字。
- 进制转换验证:
- 将当前数字视为进制数
- 计算其在进制下的数值
- 验证该数值是否是的整数倍
- 结果输出:输出满足条件的最大数字或提示不存在。
C++实现
#include <iostream> #include <cstdio> using namespace std; typedef long long LL; bool judge(int r, int b1, int b2) { LL ret = 0, t = 1; int x = r; while(x) { ret += x % b1 * t; // 将B1进制数转换为B2进制数值 x /= b1; t *= b2; } return ret % r == 0; // 检查是否是r的整数倍 } int main() { int n, b1, b2, r1, r2; scanf("%d", &n); while(n--) { scanf("%d%d%d%d", &b1, &b2, &r1, &r2); int ans = r1; // 从大到小搜索满足条件的最大i for(int i = r2 - 1; i > r1; i--) { if(judge(i, b1, b2)) { ans = i; break; } } if(ans == r1) printf("Non-existent.\n"); else printf("%d\n", ans); } return 0; }
代码说明
-
judge函数:
- 参数:当前数字,基数和
- 功能:将视为进制数,计算其在进制下的数值
- 返回值:该数值是否是的整数倍
-
主函数逻辑:
- 读取输入参数
- 从区间上限开始向下搜索
- 使用judge函数验证每个候选数字
- 输出最大满足条件的数字或不存在提示
-
优化处理:
- 从大到小搜索,找到第一个满足条件的数字即可返回
- 使用long long类型防止数值溢出
- 时间复杂度为,在题目限制范围内高效
- 1
信息
- ID
- 2028
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者