1010 Radix

BigInteger:

java 复制代码
import java.util.Scanner;
import java.math.BigInteger;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String N1 = in.next();
        String N2 = in.next();
        int tag = in.nextInt();
        long radix = in.nextLong();  // 初始进制

        BigInteger tgt = BigInteger.ZERO;
        if (tag == 1) {
            tgt = convert10(N1, radix);
        } else {
            tgt = convert10(N2, radix);
        }

        String process = (tag == 1) ? N2 : N1;
        BigInteger res = BigInteger.valueOf(-1);
        long maxDigit = getRange(process) + 1;  // 可能的最小基数
        BigInteger l = BigInteger.valueOf(maxDigit);
        BigInteger r = tgt.max(BigInteger.valueOf(maxDigit));

        while (l.compareTo(r) <= 0) {  // 左闭右闭区间
            BigInteger mid = l.add(r).divide(BigInteger.TWO);
            BigInteger cur = convert10(process, mid.longValue());
    
            if (cur.equals(tgt)) {
                res = mid;
                break;
            } else if (cur.compareTo(tgt) > 0) {
                r = mid.subtract(BigInteger.ONE);  // cur 超过 tgt 或发生溢出,缩小右边界
            } else {
                l = mid.add(BigInteger.ONE);  // cur 小于 tgt,增加左边界
            }
        }

        if (res.equals(BigInteger.valueOf(-1))) {
            System.out.println("Impossible");
        } else {
            System.out.println(res);
        }
    }

    // 将字符串 s 按照 radix 进制转换为 10 进制数
    public static BigInteger convert10(String s, long radix) {
        BigInteger res = BigInteger.ZERO;
        BigInteger base = BigInteger.ONE;
        BigInteger bigRadix = BigInteger.valueOf(radix);
        
        for (int i = s.length() - 1; i >= 0; i--) {
            char c = s.charAt(i);
            BigInteger value;
            if (Character.isDigit(c)) {
                value = BigInteger.valueOf(c - '0');
            } else {
                value = BigInteger.valueOf(c - 'a' + 10);
            }

            res = res.add(value.multiply(base));
            base = base.multiply(bigRadix);
        }

        return res;
    }

    // 获取字符串中最大的字符所代表的数值,用于确定最小的可能进制
    public static long getRange(String s) {
        long maxDigit = -1;
        for (char c : s.toCharArray()) {
            if (Character.isDigit(c)) {
                maxDigit = Math.max(maxDigit, c - '0');  // 数字字符
            } else if (Character.isLetter(c)) {
                maxDigit = Math.max(maxDigit, c - 'a' + 10);  // 字母字符
            }
        }
        return maxDigit;
    }
}

long:

java 复制代码
import java.util.Scanner;
import java.math.BigInteger;
public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        String N1 = in.next();
        String N2 = in.next();
        int tag = in.nextInt();
        long radix = (long) in.nextInt();
        long tgt = -1;
        if(tag == 1){
            tgt = convert10(N1, radix);
        }else{
            tgt = convert10(N2, radix);
        }
        String process = tag == 1 ? N2 : N1;
        long res = -1;
        long l = getRange(process) + 1;
        long r = Math.max(tgt, l);
        while(l <= r){//左闭右闭
            long mid = (l+r) >> 1;
            long cur = convert10(process, mid);
            if(cur == tgt){
                res = mid;
                break;
            }else if(cur == -1 || cur > tgt){
                r = mid - 1;
            }else{
                l = mid + 1;
            }
        }
        if(res == -1){
            System.out.println("Impossible");
        }else{
            System.out.println(res);
        }
    }
    public static long convert10(String s, long radix){
        char[] ch = s.toCharArray();
        long res = 0;
        long base = 1;
        for(int i = ch.length-1; i >= 0; i--){
            if(0 <= ch[i]-'0' && ch[i]-'0' <= 9){
                res += base * (ch[i]-'0');
            }else if(0 <= ch[i]-'a' && ch[i]-'a' <= 25){
                res += base * (ch[i]-'a'+10);
            }
            base *= radix;
            if(res < 0 || base < 0){
                return -1;
            }
        }
        return res;
    }
    public static long getRange(String s) {
        char[] ch = s.toCharArray();
        long maxDigit = -1;
        for (char c : ch) {
            if (Character.isDigit(c)) {
                maxDigit = Math.max(maxDigit, c - '0');  // 处理数字
            } else if (Character.isLetter(c)) {
                maxDigit = Math.max(maxDigit, c - 'a' + 10);  // 处理字母
            }
        }
        return maxDigit;
    }
}
相关推荐
Kaltistss24 分钟前
98.验证二叉搜索树
算法·leetcode·职场和发展
知己如祭28 分钟前
图论基础(DFS、BFS、拓扑排序)
算法
mit6.82437 分钟前
[Cyclone] 哈希算法 | SIMD优化哈希计算 | 大数运算 (Int类)
算法·哈希算法
c++bug40 分钟前
动态规划VS记忆化搜索(2)
算法·动态规划
哪 吒42 分钟前
2025B卷 - 华为OD机试七日集训第5期 - 按算法分类,由易到难,循序渐进,玩转OD(Python/JS/C/C++)
python·算法·华为od·华为od机试·2025b卷
军训猫猫头1 小时前
1.如何对多个控件进行高效的绑定 C#例子 WPF例子
开发语言·算法·c#·.net
success2 小时前
【爆刷力扣-数组】二分查找 及 衍生题型
算法
Orlando cron2 小时前
数据结构入门:链表
数据结构·算法·链表
牛客企业服务3 小时前
2025年AI面试推荐榜单,数字化招聘转型优选
人工智能·python·算法·面试·职场和发展·金融·求职招聘
糖葫芦君4 小时前
Policy Gradient【强化学习的数学原理】
算法