栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

PAT 甲级 1010 Radix (25 分)(Java)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

PAT 甲级 1010 Radix (25 分)(Java)

文章目录
  • PAT 甲级 1010 Radix (25 分)(Java)
    • 题目
    • 题意解读
    • 解题思路
    • 解法
      • 解法一

PAT 甲级 1010 Radix (25 分)(Java) 题目

题目链接

题意解读

这题的大体意思就是给两个数N1和N2,数位长度不超过10,并指出其中一个数是几进制数,然后问另一个数用多少进制表示,可以使得N1==N2;

解题思路

首先要明确的一个点是:

虽然题目表明了其中给出进制的数一定会是35进制以内的数,假设为N1,因为使用0-9,a-z只能表示到最高35进制,但这并不意味着另一个数也是如此,另一个数的进制最大应该是多少呢?应该是N1十进制表示的数,如10000 10 1 10 这个输入,表明10000是10进制数,此时第二个数若是10000进制数,此时两者是相等的;那是否会有这样的疑问?哪有这么多字母表示10000进制数的每个数位,这我们不需要担心,因为压根不用我们考虑,因为我们无需表示出来,只需要知道这是多少进制数即可。

具体的步骤为:

  1. 首先将N1转化为10进制数;
  2. 判定出N2的最小进制和最大进制,最小进制就是自身数位最大值加1,最大进制就是N1的十进制数和N2最小进制的较大值,这里之所以取较大值,是判定特殊情况的,如果有疑问可以想想6 6 1 10这个输入,题目的第0个测试用例;
  3. 最后就是通过二分法进行进制的查找,这里的转换为10进制的过程中可能出现溢出,需要进行判断;
解法 解法一
import java.util.Scanner;

public class Main {
    
    public static long toTen(String s, long radix){
        long res = 0;
        long exp = 1;
        char[] ch = s.toCharArray();
        for(int i = ch.length-1; i >= 0; --i){
            char c = ch[i];
            int num = 0;
            if(c >= '0' && c <= '9'){
                num = c - '0';
            }else if(c >= 'a' && c <= 'z'){
                num = c - 'a' + 10;
            }
            res += num * exp;
            exp *= radix;
            if(res < 0 || exp < 0){
                return -1;
            }
        }
        return res;
    }
    // 得出当前数字所有数位的最大值
    public static long getMax(String another){
        long max = -1;
        for(int i=0; i= '0' && c <= '9'){
                num = c - '0';
            }else if(c >= 'a' && c <= 'z'){
                num = c - 'a' + 10;
            }
            max = Math.max(num, max);
        }
        return max;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] st = sc.nextLine().split(" ");
        String n = st[0];
        String m = st[1];
        int tag = Integer.valueOf(st[2]);
        int radix = Integer.valueOf(st[3]);

        long origin;
        String another;
        if(tag == 1){
            origin = toTen(n, radix);
            another = m;
        }else{
            origin = toTen(m, radix);
            another = n;
        }
        long max = getMax(another);
        long i = max + 1, j = Math.max(origin, i);
        while(i <= j){
            long mid = (i + j) >> 1;
            long ano = toTen(another, mid);
            if(ano == origin) {
                System.out.println(mid);
                return;
            }else if(ano == -1 || ano > origin){
                j = mid - 1;
            }else{
                i = mid + 1;
            }
        }
        System.out.println("Impossible");
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/343193.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号