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;
    }
}
相关推荐
Lumos_77716 分钟前
Linux -- 线程
java·jvm·算法
七颗糖很甜42 分钟前
“十五五”气象发展规划:聚焦五大核心任务
大数据·python·算法
科研前沿1 小时前
镜像视界浙江科技有限公司的关键技术突破有哪些?
大数据·人工智能·科技·算法·音视频·空间计算
嫩萝卜头儿1 小时前
2 - 复杂度收尾 + 链表经典OJ
数据结构·算法·链表·复杂度
星马梦缘1 小时前
算法设计与分析 作业二 答案与解析
算法·图论·dfs·bfs·floyd-warshall·bellman_ford·多源最短路
玛丽莲茼蒿1 小时前
Leetcode hot100 每日温度【中等】
算法·leetcode·职场和发展
cjp5601 小时前
009.UG二次开发,任务环境草图优化3(高级功能生成直线)
算法
样例过了就是过了2 小时前
LeetCode热题100 分割等和子集
数据结构·c++·算法·leetcode·动态规划
逻辑驱动的ken2 小时前
Java高频面试考点18
java·开发语言·数据库·算法·面试·职场和发展·哈希算法
北顾笙9802 小时前
day38-数据结构力扣
数据结构·算法·leetcode