【华为机试】进制转换

本文介绍了一种将十六进制数值字符串转换为十进制数值的方法。提供了两种实现方式:一是利用Java内置的Integer类parseInt方法进行转换;二是手动实现转换逻辑,通过遍历字符串中的每个字符并计算其对应的十进制数值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

此题出自牛客网的华为机试在线训练专题

题目描述

写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串。(多组同时输入 )

输入描述:

 

输入一个十六进制的数值字符串。

输出描述:

 

输出该数值的十进制字符串。

示例1

输入

0xA

输出

10

题解如下

方法一:使用Integer类中的方法实现

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        
        while(sc.hasNext()){
            String s = new String(sc.nextLine());
            s = s.substring(2);
            Integer i = Integer.parseInt(s,16);
            System.out.println(i);
        }
    }
}

知识点:

public static int parseInt(String s,
                           int radix)
                    throws NumberFormatException

使用第二个参数指定的基数,将字符串参数解析为有符号的整数。除了第一个字符可以是用来表示负值的 ASCII 减号 '-' ('\u002D’)外,字符串中的字符必须都是指定基数的数字(通过 Character.digit(char, int) 是否返回一个负值确定)。返回得到的整数值。

如果发生以下任意一种情况,则抛出一个 NumberFormatException 类型的异常:

  • 第一个参数为 null 或一个长度为零的字符串。
  • 基数小于 Character.MIN_RADIX 或者大于 Character.MAX_RADIX
  • 假如字符串的长度超过 1,那么除了第一个字符可以是减号 '-' ('u002D’) 外,字符串中存在任意不是由指定基数的数字表示的字符。
  • 字符串表示的值不是 int 类型的值。

示例:

parseInt("0", 10) 返回 0
parseInt("473", 10) 返回 473
parseInt("-0", 10) 返回 0
parseInt("-FF", 16) 返回 -255
parseInt("1100110", 2) 返回 102
parseInt("2147483647", 10) 返回 2147483647
parseInt("-2147483648", 10) 返回 -2147483648
parseInt("2147483648", 10) 抛出 NumberFormatException
parseInt("99", 8) 抛出 NumberFormatException
parseInt("Kona", 10) 抛出 NumberFormatException
parseInt("Kona", 27) 返回 411787

 

参数:

s - 包含要解析的整数表示形式的 String

radix - 解析 s 时使用的基数。

返回:

使用指定基数的字符串参数表示的整数。

抛出:

NumberFormatException - 如果 String 不包含可解析的 int

方法二:自己实现转换

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        
        while(sc.hasNext()){
            String s = new String(sc.nextLine());
            s = s.substring(2);
            char[] arr = s.toCharArray();
            int count = 0;
            int num=0;
            int temp=0;
            for(int i=arr.length-1;i>=0;i--){
                if(arr[i]>='0'&&arr[i]<='9'){
                    temp = arr[i]-'0';
                } else if(arr[i]>='a'&&arr[i]<='z'){
                    temp = arr[i]-'a'+10;
                } else if(arr[i]>='A'&&arr[i]<='Z'){
                    temp = arr[i]-'A'+10;
                } else {
                    break;
                }
                num += temp*Math.pow(16,count);
                count++;
            }
            System.out.println(num);
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值