[编程题]进制转换

1、题目内容

[编程题]进制转换

写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串。(多组同时输入 )
输入描述:
输入一个十六进制的数值字符串。
输出描述:
输出该数值的十进制字符串。
输入例子:
0xA
输出例子:
10

2、题目解析

方法1:将十六进制的数值字符串转换成十进制字符串,用Integer类的

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

方法:使用第二个参数指定的基数,将字符串参数解析为有符号的整数。

因为十六进制的数值字符串的前两个字符是0和X,所以要截取字符串前两个字符之后的子串再解析成整形。

代码如下:

import java.util.Scanner;
public class Main{
    public static void main(String[]args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){//多个测试用例用while(sc.hasNext()){}
            String s = sc.next().substring(2);
            System.out.println(Integer.parseInt(s,16));
        }        
    }
}

方法2:自己写转换方法

用一个字符串可变序列StringBuilder来接收输入的十六进制的数值字符串,因为十六进制的数值字符串的前两个字符是0和X,所以要截取字符串前两个字符之后的子串,用得到的子串转换成10进制。例如:0x12转换成10进制为1乘以16的1次方加上2乘以16的0次方(1*16^1+2*16^0;),观察16的幂正好是字符串中的字符倒序之后的下标,即字符值乘以16的字符下标次方。所以要反转字符串,再将字符串转化成字符数组,遍历字符数组在通过上述方法转换成10进制。

步骤

1、创建扫描器对象(Scanner sc = new Scanner(System.in))

2、为实现多用例测试;使用while(sc.hasNext()){}来判断是否还有输入。

3、在while循环里实现转换功能。

4、创建一个字符串可变序列StringBuilder对象;

5、将键盘录入的字符串值添加到字符串可变序列

6、将字符串可变序列对象反转并截取,得到一个新的字符串。

7、将新的字符串转化成字符数组

8、定义一个int型的变量,装载转换后的10进制值。

9、遍历字符数组,判断每个字符。因为十六进制的a(A)->10,b(B)->11,c(C)->12,d(D)->13,e(E)->14,f(F)->15.超出F就不是16进制数啦。

for(int i=0;i<ch.length;i++){
    if(ch[i]>='A'&&ch[i]<='F'){
         sum+=(ch[i]-55)*Math.pow(16, i);
    }else if(ch[i]>='a'&&ch[i]<='f'){
         sum+=(ch[i]-87)*Math.pow(16, i);
    }else if(ch[i]>='0'&&ch[i]<='9'){
         sum+=(ch[i]-48)*Math.pow(16, i);
    }else{
         System.out.println("输入的字符串不是十六进制形式!");
    }
}

10、输出int型的变量就是转换后的10进制数啦。

代码如下:

                                import java.util.Scanner;
public class Main{
    public static void main(String[]args){
        /*Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            String s = sc.next().substring(2);
            System.out.println(Integer.parseInt(s,16));
        }*/
        Scanner sc = new Scanner(System.in);
        //不用Integer类的方法转换,自己转换
        while(sc.hasNext()){
            StringBuilder sb = new StringBuilder();
            sb.append(sc.next());
            String s = sb.reverse().substring(0, sb.length()-2);
            char[]ch = s.toCharArray()
            int sum = 0;
            for(int i=0;i<ch.length;i++){
            if(ch[i]>='A'&&ch[i]<='F'){
                sum+=(ch[i]-55)*Math.pow(16, i);
            }else if(ch[i]>='a'&&ch[i]<='f'){
                 sum+=(ch[i]-87)*Math.pow(16, i);
            }else if(ch[i]>='0'&&ch[i]<='9'){
                 sum+=(ch[i]-48)*Math.pow(16, i);
            }else{
                    System.out.println("输入的字符串不是十六进制形式!");
            }
         }
           System.out.println(sum);
        }   
    }
}

 

 

 

转载于:https://my.oschina.net/u/2444659/blog/664544

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值