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

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

被折叠的 条评论
为什么被折叠?



