1 条题解

  • 1
    @ 2025-4-6 16:20:08

    题目分析

    题意简述

    给定三个整数 pp, qq, rr,找到一个进制 BB2B162 \leq B \leq 16),使得在 BB 进制下 p×q=rp \times q = r。如果有多个满足条件的 BB,输出最小的;如果没有,输出 00

    输入

    • 多组测试用例,每组给出 pp, qq, rr
    • 所有数字均为数字字符(00-99),范围 1p,q,r1,000,0001 \leq p, q, r \leq 1,000,000

    输出

    每组测试用例的结果,表示满足条件的最小进制 BB00


    解题思路

    进制转换

    pp, qq, rrBB 进制转换为十进制后验证 p×q=rp \times q = r
    注意: 数字的每一位必须小于 BB,否则 BB 进制下该数字非法。

    枚举优化

    1. BB 的最小可能值maxdigit+1max\\_digit + 1maxdigitmax\\_digitpp, qq, rr 中最大的数字)。
    2. BB 的最大值1616,直接枚举 BBmaxdigit+1max\\_digit + 11616
    3. 提前终止:一旦找到满足条件的 BB,立即返回,保证结果是最小的。

    代码实现

    #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;
    }
    

    代码说明

    1. 输入处理
      • 使用 string 读取 pp, qq, rr,避免数值过大或前导零问题。
    2. 进制转换
      • to_decimal 函数将字符串从 BB 进制转换为十进制,并检查每一位是否合法。
    3. 枚举优化
      • maxdigit+1max\\_digit + 1BB 的最小可能值,直接枚举到 1616
    4. 提前终止
      • 找到第一个满足条件的 BB 后立即退出循环,保证结果最小。
    • 1

    信息

    ID
    332
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    7
    已通过
    1
    上传者