Hiccup
发布于 2025-11-07 / 11 阅读
0
1

算法刷题Day04-20251107-1

进制转换

知识点 字符串

描述

对于给定的十六进制数,输出其对应的十进制表示。

在本题中,十六进制数的格式为:0x 开头,后跟若干个十六进制数字(保证为 0-9 和 A-F 中的一个)。其中,A-F 依次代表十进制中的 10∼15。

输入描述:

在一行上输入一个十六进制数 s,代表待转换的十六进制数,格式见题干。保证 s 转化得到的十进制数 x 的范围为 1≦x<2^31

输出描述:

在一行上输出一个整数,代表 s 对应的十进制数。

我的答案:

import java.util.Scanner;
​
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str = in.nextLine();
        String numStr = str.replace("0x", "");
        int count = 0;
        Long sum = 0L;
        for (int i = numStr.length()-1; i >= 0; i--) {
            Long a = 1L << (4 * count);
            sum += a * toInt(String.valueOf(numStr.charAt(i)));
            count++;
        }
        System.out.println(sum);
    }
​
    public static int toInt(String c) {
        switch (c) {
            case "A":
                return 10;
            case "B":
                return 11;
            case "C":
                return 12;
            case "D":
                return 13;
            case "E":
                return 14;
            case "F":
                return 15;
            default:
                return Integer.parseInt(c);
        }
    }
}

个人思路解析

  • 如果没有进制说明,进制推算也会是个考点;

  • 16的次方的计算:循环乘(暴力解法吧)、位运算、Math.pow(16, n) ;

  • A-F的数值转换:字符与 ASCII 码的关系;(我写的比较笨)

当然,既然标着知识点 字符串, 字符串的基本操作算是基础知识点了。

拾得

字符与 ASCII 码的核心关系是:ASCII 码是字符的 “数字编号”,每个基础字符(英文字母、数字、常用符号)都对应唯一的 ASCII 十进制数,Java 中char类型本质就是存储这个编号(ASCII 是 Unicode 的子集,范围 0-127)。

核心映射关系

  • 字符是 “表象”(如'0''A''a'),ASCII 码是 “底层数字”(如 48、65、97)。

  • 每个基础字符(英文字母、数字、标点)在 ASCII 表中都有固定编号,且编号按规律排列:

    1. 数字字符'0'-'9':ASCII 码从 48 到 57('0'=48'1'=49,…,'9'=57)。

    2. 大写英文字母'A'-'F':ASCII 码从 65 到 70('A'=65'B'=66,…,'F'=70)。

    3. 小写英文字母'a'-'z':ASCII 码从 97 到 122('a'=97'b'=98,…,'f'=102)。

Java 中的转换逻辑

  • 直接强转:char转 ASCII 码用(int)字符,ASCII 码转char(char)数字

    System.out.println((int)'0'); // 输出48('0'的ASCII码)
    System.out.println((int)'A'); // 输出65('A'的ASCII码)
    System.out.println((char)65); // 输出'A'(ASCII码65对应字符)
  • 字符运算本质是 ASCII 码运算:之前题目中'5' - '0' = 5,本质是53 - 48 = 5'A' - 'A' +10 =10,本质是65-65+10=10



评论