栈的应用之进制转换

十进制转换为十六进制

输入任意一个非负十进制整数,打印输出与其等值的十六进制数,例如计算654321的十六进制:

  • 654321 ÷ 16 = 40895 ~ 1
  • 40895 ÷ 16 = 2555 ~ 15
  • 2555 ÷ 16 = 159 ~ 11
  • 159 ÷ 16 = 9 ~ 15
  • 9 ÷ 16 = 0 ~ 9

将余数依次存入栈中,然后依次弹栈,因此可以得出 654321 对应的十六进制数为 9FBF1
代码实现

public static void main(String[] args){
	Scanner scan = new Scanner(System.in);
	System.out.println("请输入一个非负十进制整数");
	int number = scan.nextInt();

	//1.创建一个栈 用来存储余数
	ArrayStack<Character> stack = new ArrayStack<>();
	int mod;
	//2.开始计算余数
	while(number != 0){
		mod = number % 16;
		if(mod < 10){ //数字0-9
                //'0' + 3 表示的是字符'0'之后的第3个位置的字符'3'的编码
                stack.push((char)('0' + mod));
            }else{  //数字10-15 -> A-F
                //'A' + 11 - 10 表示的是字符'A'之后的第1个位置的字符'B'的编码
                stack.push((char)('A' + mod - 10));
            }
            number /= 16;	//自除
	}
	while(!stack.isEmpty){
		System.out.println(stack.pop());
	}
} 

运行结果
在这里插入图片描述

十六进制转换为十进制

在这里插入图片描述
代码实现

public static void main(String[] args){
	//1.获取用户的输入 输入一个十六进制的字符串
    Scanner scanner = new Scanner(System.in);
    System.out.println("请输入一个非负十六进制整数");
    String hex = scanner.nextLine();

    //2.创建一个栈 存储每一个字符
    ArrayStack<Character> stack = new ArrayStack<>();

	//3.将字符串中的字符依次进栈
	for(int i = 0; i < hex.length(); i++){
		stack.push(hex.charAt(i));
	}
	
	//4.依次弹栈,并累加计算结果
	int sum = 0;
        int exponent = 0; //幂数
        char c; //定义弹出元素c
        while(!stack.isEmpty()){
            c = stack.pop();
            sum += getNumber(c) * Math.pow(16,exponent);
            exponent++;
        }
        System.out.println(sum);
}

public static int getNumber(char c){
	//合法的范围 '0' - '9' || 'A' - 'F'
    //验证字符是否合法
    if(!(c >= '0' && c <= '9' || c >= 'A' && c <= 'F')){
    	throw new IllegalArgumentException("请输入正确格式的十六进制数");
    }
    if(c >= '0' && c <= '9'){
    	return c - '0';
    }else{
 		return c - 'A' + 10;
 	}
}

运行结果
在这里插入图片描述

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值