蓝桥杯试题 基础练习 BASIC-11 十六进制转十进制 JAVA——冲刺蓝桥杯第六天

前言

进制转化包括这篇我写了三篇了,这篇没讲的好多要点都在其他两篇讲到了大家有需要请点击下面链接跳转去学习

蓝桥杯试题 基础练习 BASIC-12 十六进制转八进制 JAVA——冲刺蓝桥杯第六天
蓝桥杯试题 基础练习 BASIC-10 十进制转十六进制 JAVA——冲刺蓝桥杯第五天

试题 基础练习 十六进制转十进制

资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
  从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
  注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
样例输入
FFFF
样例输出
65535

要点

  1. 输入数据的范围,输入数据范围决定我们使用哪种数据类型

    java八大数据类型在这里插入图片描述
    看到这个8位,我就想起int型能表示的最大数2147483647对应的16进制为7FFFFFFF,正好8位,如果这道题输入为比7FFFFFFF大一点,比如8FFFFFFF,那我们转化过来的10进制数就不能是int型,而得是long
    而最后本题的测评数据也没有让我失望
    在这里插入图片描述
    果然有一个测评数据的输入大于7FFFFFFF,来考察我们是否考虑了输入数据的范围,是否考虑了数据类型

思路一:常规做法——进制转换 字符 循环

  1. a.charAt(i)
    方法解释:.charAt(int index) (return)char
    输入参数为位置索引,输出为该位置的字符

    String a = "HelloWorld";
    for (int i = 0; i < a.length(); i++) {
    	System.out.print(a.charAt(i) + " "); //输出H e l l o W o r l d
    }
    
  2. (long) Math.pow(16, a.length() - i - 1)
    sum = sum + tmp * (long) Math.pow(16, a.length() - i - 1);
    Math.pow(16, a.length() - i - 1)的返回值类型为double,如果不转化为整数型,会导致输出也是double,所以我们需要转化为整数型,整数型有两种intlong,因为数据范围我们只能选long

    System.out.println(5 + 2.0); //输出7.0为double 5为int,2.0为double
    
  3. tmp = a.charAt(i) - '0';
    char型与int的相互转化
    char转int
    char与int的相互转化,联想ASCII码,字符'0'对应的值为48,所以不能直接加减''

    char ch='9';
    int ch_int=ch-'0';//此时ch_int=9
    

    int转char

    int i = 9;
    char i_ch = (char) (i + '0'); // 此时i_ch='9'
    

本题代码

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String a = sc.next();
        sc.close();
        int tmp; // 一位16进制数转化后的10进制数
        long sum = 0; //这里只能为long型,最终输出的10进制可能特别大,大到超出int所能表示的最大数
        for (int i = 0; i < a.length(); i++) {
            switch (a.charAt(i)) {
                case 'A':tmp = 10; break;
                case 'B':tmp = 11; break;
                case 'C':tmp = 12; break;
                case 'D':tmp = 13; break;
                case 'E':tmp = 14; break;
                case 'F':tmp = 15; break;
                default: tmp = a.charAt(i) - '0';
            }
            sum = sum + tmp * (long) Math.pow(16, a.length() - i - 1);
            // 如果Math.pow(16,a.length()-i-1)转化为int会导致错误,
            // 16的15次方超出int型数据的范围:16的15次大于2147483647
        }
        System.out.println(sum);
    }
}

思路二:简单做法,使用java自带的方法

  1. Long.valueOf(a, 16)
    Long.valueOf(String s, int radix) (return)Long
    第一个参数为要读取的字符串,第二个是读取该字符串所要使用的进制,返回某字符串的某进制的值(Long型)

本题代码

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String a = sc.next();
        // int能表示的最大数2147483647转化为16进制为7FFFFFFF,正好8位,
        // 如果这里的输入比7FFFFFFF大一点,那我们转化后的10进制数据就不能是int类型
        sc.close();
        System.out.println(Long.valueOf(a, 16));
    }
}
posted @ 2020-03-18 12:06  爱做梦的子浩  阅读(207)  评论(0编辑  收藏  举报