I need to solve this problem where i need to convert hexadecimal numbers to decimals.
Issue
I have compiled it without any errors, but my output came out wrong. Can someone show how to fix these errors?
Code
import java.util.Scanner;
import java.io.*;
class HexToDecException extends Exception {
public HexToDecException(String msg) {
super(msg);
}
}
public class Main {
public static int hexToDec(String hex) throws HexToDecException {
char currentChar;
int dec=0;
int power = 0;
for(int i=hex.length() 1;i>=0;i--){// by reverse
currentChar = hex.charAt(i);
if(currentChar>='0' && currentChar<='9'){
dec = Math.pow(16,power)*(currentChar - '0');
power ;
}
else if(currentChar>='a' && currentChar<='f'){
dec = Math.pow(16,power)*(currentChar - 'a' 10);
power ;
}
else if(currentChar>='A' && currentChar<='G'){
dec = Math.pow(16,power)*(currentChar - 'A' 10);
power ;
}
else
throw new IllegalArgumentException("Invalid Character in Hexadecimal string");
}
return power;
}
public static void main(String[] args){
Scanner scan = null;
try{
scan = new Scanner(System.in);
int n = scan.nextInt();
for(int i=0;i<n;i )
System.out.println(hexToDec(scan.next()));
}
catch(Exception ex){
ex.printStackTrace();
}
finally{
System.out.println("That's all.");
}
}
}
Example
Input:
5 6B 5 4AZ A5 9
Expected Output:
107 5 Invalid hexadecimal number 165 9
Output that i got:
That's all
CodePudding user response:
Your solution is close. Here are changes to make so that it runs correctly:
- modify the
return
statement ofhexToDec()
to return the decimal number you've constructed, not the power, so change this:return power
to this:return dec
- modify
throws
clause to this:throw new HexToDecException("Invalid hexadecimal number");
– use the custom exception you defined, and edit the string message to match the output you're expecting - change the
for
loop inhexToDec()
so it that properly checks each position in the input string, so change this:for (int i = hex.length() 1
to this:for (int i = hex.length() - 1
. Maybe read up on howString.length()
works in relation tocharAt()
. If a string has a length N, the corresponding "Nth" position in that string has to be referenced by N-1. N itself would never work, and N 1 would also not work. - finally, rewrite the main loop to wrap the call to
hexToDec()
in atry-catch
, and print the exception message if an exception is thrown:Scanner scan = new Scanner(System.in); int n = scan.nextInt(); for (int i = 0; i < n; i ) { String nextInput = scan.next(); try { int x = hexToDec(nextInput); System.out.print(x " "); } catch (HexToDecException e) { System.out.print(e.getMessage() " "); } }
After those changes, this input:
5 6B 5 4AZ A5 9
will produce this output:
107 5 Invalid hexadecimal number 165 9