1 条题解
-
1
题目分析
题意简述
给定三个整数 , , ,找到一个进制 (),使得在 进制下 。如果有多个满足条件的 ,输出最小的;如果没有,输出 。
输入
- 多组测试用例,每组给出 , , 。
- 所有数字均为数字字符(-),范围 。
输出
每组测试用例的结果,表示满足条件的最小进制 或 。
解题思路
进制转换
将 , , 从 进制转换为十进制后验证 。
注意: 数字的每一位必须小于 ,否则 进制下该数字非法。枚举优化
- 的最小可能值:( 是 , , 中最大的数字)。
- 的最大值:,直接枚举 从 到 。
- 提前终止:一旦找到满足条件的 ,立即返回,保证结果是最小的。
代码实现
#include <iostream> #include <stdio.h> #include <vector> using namespace std; int main() { int n; scanf("%d", &n); for(int i = 0; i < n; i++){ int a, b, c; scanf("%d%d%d", &a, &b, &c); vector<int> digitA, digitB, digitC; int mxDigit = 0; while(a > 0){ int A = a%10; digitA.push_back(A); if(A > mxDigit) mxDigit = A; a/=10; } while(b > 0){ int B = b%10; digitB.push_back(B); if(B > mxDigit) mxDigit = B; b/=10; } while(c > 0){ int C = c%10; digitC.push_back(C); if(C > mxDigit) mxDigit = C; c/=10; } int wsA = digitA.size(), wsB = digitB.size(), wsC = digitC.size(); bool get = 0; for(int BB = mxDigit+1; BB <= 16; BB++){ long long int aa = 0, bb = 0, cc = 0; for(int j = wsA-1; j >= 0; j--){ aa*=BB; aa+=digitA[j]; } for(int j = wsB-1; j >= 0; j--){ bb*=BB; bb+=digitB[j]; } for(int j = wsC-1; j >= 0; j--){ cc*=BB; cc+=digitC[j]; } if(aa*bb==cc){ get = 1; printf("%d\n", BB); break; } } if(!get){ printf("0\n"); } } return 0; }
代码说明
- 输入处理
- 使用
string
读取 , , ,避免数值过大或前导零问题。
- 使用
- 进制转换
to_decimal
函数将字符串从 进制转换为十进制,并检查每一位是否合法。
- 枚举优化
- 是 的最小可能值,直接枚举到 。
- 提前终止
- 找到第一个满足条件的 后立即退出循环,保证结果最小。
- 1
信息
- ID
- 332
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 7
- 已通过
- 1
- 上传者