欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

进制转换

程序员文章站 2022-04-04 11:13:45
...

https://www.nowcoder.com/practice/8f3df50d2b9043208c5eed283d1d4da6?tpId=37&tqId=21228&tPage=1&rp=&ru=%2Fta%2Fhuawei&qru=%2Fta%2Fhuawei%2Fquestion-ranking

 

一、题目描述

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

 

二、代码实现

1、对每个字符进行解析

import java.util.Scanner;
public class Main {
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            String input = sc.next();
            String str = input.substring(2);
            
            int result = 0;
            //int multiply = 1;
            for (int i=0; i<str.length(); i++) {
                char ch = str.charAt(i);
                int constant = 0;
                if (ch >= '0' && ch <= '9') {
                    constant = ch - '0';
                } else {
                    switch(ch) {
                        case 'A':
                        case 'a':
                            constant = 10;
                            break;
                        case 'B':
                        case 'b':
                            constant = 11;
                            break;
                        case 'C':
                        case 'c':
                            constant = 12;
                            break;
                        case 'D':
                        case 'd':
                            constant = 13;
                            break;
                        case 'E':
                        case 'e':
                            constant = 14;
                            break;
                        case 'F':
                        case 'f':
                            constant = 15;
                    }
                }
                
                result = result * 16 + constant;
            }
            
            System.out.println(result);
        }
    }
    
}

另一种写法:

通过查看ASCII码表,可以看到字符'0'对应的整数为48,字符'A'对应的整数为65,因此字符'0'-字符'9'转换成整数形式应该减去48。字符'A'转换成整数形式应该是:65-48-7=65-55=10,因此字符'A'-字符'F'转换成整数形式应该减去55。

进制转换

import java.util.Scanner;
import java.math.BigDecimal;
public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        while (sc.hasNext()) {
            String input = sc.next();
            StringBuilder sb = new StringBuilder();
            sb.append(input);
            String str = sb.reverse().substring(0, sb.length()-2);
            char[] arr = str.toCharArray();
            
            int sum = 0;
            for (int i=0; i<arr.length; i++) {
                if (arr[i]>='A' && arr[i]<='F') {
                    sum += (Integer.valueOf(arr[i])-55)*Math.pow(16, i);
                } else {
                    sum += (Integer.valueOf(arr[i])-48)*Math.pow(16, i);
                }
            }
            
            System.out.println(sum);
        }
    }
    
}

2、利用Java自带的API

Integer的parse(s, radix)方法,s为输入字符串,radix为进制数,返回值为int型

import java.util.Scanner;
public class Main {

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

Integer的decode()方法,将String解码为Integer,String可以是十进制、十六机制、八进制(0表示八进制,ox\0X\#表示十六机制,什么都不写表示十进制,例如-0X123就是表示十六机制的字符串,其中符号位为-)

import java.util.Scanner;
public class Main {
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        while (sc.hasNext()) {
            String input = sc.next();
            System.out.println(Integer.decode(input));
        }
    }
    
}

3、考虑大数据的情况

如果输入是超大数据的情况下,int、long都会越界,这时,我们就需要输出十进制数的字符串表达。

除了大数情况,其实有时还需要校验输入的合法性。

import java.util.Scanner;
import java.math.BigDecimal;
public class Main {
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        while (sc.hasNext()) {
            String input = sc.next();
            String str = input.substring(2);
            char[] arr = str.toCharArray();
            int len = str.length();
            
            BigDecimal result = new BigDecimal(0);
            BigDecimal carry = new BigDecimal(16);
            
            for (char ch : arr) {
                len--;
                if (ch >= 'A') {
                    BigDecimal temp = new BigDecimal(ch).subtract(new BigDecimal(55));
                    BigDecimal t = temp.multiply(carry.pow(len));
                    result = result.add(t);
                } else {
                    BigDecimal temp = new BigDecimal(ch).subtract(new BigDecimal(48));
                    BigDecimal t = temp.multiply(carry.pow(len));
                    result = result.add(t);
                }
            }
            
            System.out.println(result);
        }
    }
    
}

 

相关标签: 华为机试