蓝桥杯练习题之十六进制转十进制

博主分享了在蓝桥杯比赛中遇到的一道十六进制转十进制的题目,虽然过程曲折,经过三次修改代码,最终成功解决了内存处理问题并获得满分。文章提到了之前不成功的代码片段,并指出通过修改变量类型解决了问题。感兴趣的读者可以在GitHub上查看完整代码。

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

这道题博主我改了三次终于通过了测试...


讲真,这道题并不难,只是前两次代码测试总是拿不到满分,也就是说运行内存处理不当敲打

先放上我前两次的代码吧

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {

		Scanner input = new Scanner(System.in);
		String str = input.nextLine();
		
		int out = tran(str);
		System.out.println(out);
		
		input.close();
	}

	public static int tran(String str) {
		int len = str.length();
		int[] a = new int[len];
		int dec = 0;
		for (int i = len - 1; i >= 0; i--) {
			a[i] = str.charAt(i);
			
			switch (a[i]) {
			case 'A':
				a[i] = 10;
				break;
			case 'B':
				a[i] = 11;
				break;	
			case 'C':
				a[i] = 12;
				break;
			case 'D':
				a[i] = 13;
				break;
			case 'E':
				a[i] = 14;
				break;
			case 'F':
				a[i] = 15;
				break;
			default:
				a[i] = a[i] - '0';
			}
			
			int temp = 1;
			for (int j = len; j > len - i; j--) {
				temp *= 16;
			}
			dec += temp * a[i];
		}
		return dec;
	}

}
第一次的代码我只得了25分,经检查,是内存消耗过大,同时也没进行大数处理,第二次我按照锦囊二的提示按数位依次操作,每次将前面的乘16,再加上当前数位的值对dec进行运算,然而当时并没有对dec进行大数处理,于是乎,测试以75分收场...

public static int tran(String str) {
		int len = str.length();
		int[] a = new int[len];
		int[] dec = new int[len];
		int[] num = new int[len];
		int k = 0;
		dec[0] = 0;
 		for (int i = len - 1; i >= 0; i--) {
			a[i] = str.charAt(i);
			
			switch (a[i]) {
			case 'A':
				a[i] = 10;
				break;
			case 'B':
				a[i] = 11;
				break;	
			case 'C':
				a[i] = 12;
				break;
			case 'D':
				a[i] = 13;
				break;
			case 'E':
				a[i] = 14;
				break;
			case 'F':
				a[i] = 15;
				break;
			default:
				a[i] = a[i] - '0';
			}
			
			if (len - 1 == i) {
				num[k] = 1;
				dec[k] = a[i] * num[k];
			} else {
				num[k] = num[k - 1] * 16; 
				dec[k] = a[i] * num[k] + dec[k - 1];
			}
			
			k++;
		}
		return dec[k - 1];
	}

}


修改了变量类型后,代码终于满分通过了测试...

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {

		Scanner input = new Scanner(System.in);
		String str = input.nextLine();
		
		long out = tran(str);
		System.out.println(out);
		
		input.close();
	}

	public static long tran(String str) {
		int len = str.length();
		int[] a = new int[len];
		long[] dec = new long[len];
		long[] num = new long[len];
		int k = 0;
		dec[0] = 0;
 		for (int i = len - 1; i >= 0; i--) {
			a[i] = str.charAt(i);
			
			switch (a[i]) {
			case 'A':
				a[i] = 10;
				break;
			case 'B':
				a[i] = 11;
				break;	
			case 'C':
				a[i] = 12;
				break;
			case 'D':
				a[i] = 13;
				break;
			case 'E':
				a[i] = 14;
				break;
			case 'F':
				a[i] = 15;
				break;
			default:
				a[i] = a[i] - '0';
			}
			
			if (len - 1 == i) {
				num[k] = 1;
				dec[k] = a[i] * num[k];
			} else {
				num[k] = num[k - 1] * 16; 
				dec[k] = a[i] * num[k] + dec[k - 1];
			}
			
			k++;
		}
		return dec[k - 1];
	}

}


喜欢就请关注我,你们的关注是我最大的动力~

查阅相关代码请点击:https://github.com/striner/javaCode/blob/master/hexadecimalToDecimal


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值