DevX Home Today's Headlines   Articles Archive   Tip Bank   Forums

1. Registered User
Join Date
Sep 2004
Posts
8

problem with Java homework...

Ok, the problem here is the assignment asks me to create a program that asks the user to either enter a number and convert it to a roman numeral or convert a roman numeral to an int.

What I've done so far is to set up a basic menu that allows the user to choose which operation they want. So for example lets say they want to convert a roman numeral to a number...

I have the input set up to take a user inputted string, convert it to upper case and then I'm stuck.

I'm confused as to how to take the user entered string and convert it into an integer.

Lets say for example the user entered the roman numerals MCXIV. The program needs to spit out 1114.

The only thing that I can think to do would be if statements but that would be impossible because theres an infinite amount of combinations.

Any help would be greatly appreciated.

2. Registered User
Join Date
Sep 2004
Posts
223
ok, keep in mind that each roman numeral has its own value, like M is 1000 and X is 10 so on, (i think... )

So, what you need to do is to split each letter up individually, then do checks on each one, if it is an M make some variable, + 1000,

ie. if the user enters XI (ie. 11)

split it up into 2 letters X and I, then make a variable called "total" or something, then do checks on the 2 letters:
if(letter.equlas("M")){
total += 10;
}
if(letter.equals("I")){
total += 1;
}

and so on...so you would need to loop through all of the letters checking each one
you get me?

3. Registered User
Join Date
Sep 2004
Posts
8
Thanks man

Although I figured it out on my own about an hour ago just the way you described.

Also, there is an easier way than writing out a bunch of if statements.

The example I found is here

Hopefully all of this will help someone else.

Thanks again

P.S. Just for reference...
String A=("1,000,000");
String B=("500,000");
String H=("100,000");
String F=("50,000");
String Z=("10,000");
String Y=("5,000");
String M = ("1000");
String CM = ("900");
String D = ("500");
String CD =("400");
String C = ("100");
String XC = ("90");
String L = ("50");
String XL = ("40");
String X = ("10");
String IX = ("9");
String V = ("5");
String IV = ("4");
String I = ("1");

Strings A,B,F,H,Z, and Y are the extended set of roman numerals. Normally you would only see M down through I.

4. Registered User
Join Date
Sep 2004
Posts
223
nice work!

5. Registered User
Join Date
Sep 2004
Posts
8
Since I'm an open source kind of guy I thought it only relevant to post my code. I'm not posting the code for "main" though because if someone should copy this, they should do some work and learn something....

/*CODE*/

public class roman {

int length;
int romtonum;
String roman;
String num;
String romnum;

//Roman to Integer
public void conv1 (String num)
{
int i;
for (i=0;i < num.length();i++)
{
if (num.charAt(i)=='A')
{
romtonum+=1000000;
}
if (num.charAt(i)=='B')
{
romtonum+=500000;
}
if (num.charAt(i)=='H')
{
romtonum+=100000;
}
if (num.charAt(i)=='F')
{
romtonum+=50000;
}
if (num.charAt(i)=='Z')
{
romtonum+=10000;
}
if (num.charAt(i)=='Y')
{
romtonum+=5000;
}
if (num.charAt(i)=='M')
{
romtonum+=1000;
}
if (num.charAt(i)=='D')
{
romtonum+=500;
}
if (num.charAt(i)=='C')
{
romtonum+=100;
}
if (num.charAt(i)=='L')
{
romtonum+=50;
}
if (num.charAt(i)=='X')
{
romtonum+=10;
}
if (num.charAt(i)=='V')
{
romtonum+=5;
}
if (num.charAt(i)=='I')
{
romtonum+=1;
}

}//END FOR LOOP

System.out.println("\nIn roman numerals you entered " +romtonum+ "\n");
}//End Conv1

//Integer to Roman
public void conv2 (int rom)
{
while (rom >= 1000000) {
roman += "A";
rom -= 1000000;
}
while (rom >= 500000) {
roman += "B";
rom -= 500000;
}
while (rom >= 100000) {
roman += "H";
rom -= 100000;
}
while (rom >= 50000) {
roman += "F";
rom -= 50000;
}
while (rom >= 10000) {
roman += "Z";
rom -= 10000;
}
while (rom >= 5000) {
roman += "Y";
rom -= 5000;
}
while (rom >= 1000) {
roman += "M";
rom -= 1000;
}
while (rom >= 900) {
roman += "CM";
rom -= 900;
}
while (rom >= 500) {
roman += "D";
rom -= 500;
}
while (rom >= 400) {
roman += "CD";
rom -= 400;
}
while (rom >= 100) {
roman += "C";
rom -= 100;
}
while (rom >= 90) {
roman += "XC";
rom -= 90;
}
while (rom >= 50) {
roman += "L";
rom -= 50;
}
while (rom >= 40) {
roman += "XL";
rom -= 40;
}
while (rom >= 10) {
roman += "X";
rom -= 10;
}
while (rom >= 9) {
roman += "IX";
rom -= 9;
}
while (rom >= 5) {
roman += "V";
rom -= 5;
}
while (rom >= 4) {
roman += "IV";
rom -= 4;
}
while (rom >= 1) {
roman += "I";
rom -= 1;
}
System.out.println("\nYou entered " +roman+ "in roman numerals\n");
}//END CONV2

/** Creates new roman */
public roman()
{

}// End Default Constructor

}// End Class Roman

/*END CODE*/

6. Ehhh... it doesn't seem to work. I will not rule out the possibility that I have goofed here but until that dawns upon me I have a few remarks;

public void conv1 (String num) {
int i;
romtonum=0; /* <- uuups (if not they keep getting bigger for each call to this moethod, unless you reinstatiate a new roman instance for each conversion */
.
.

I ran your and my code and here is the result:

(my code output)
value for:MMMXXXI: 3031
value for:MMMXLXI: 3051
value for:CMXXI: 921
value for:XL: 40

In Roman numerals(MMMXLXI) you entered 3071
In Roman numerals(MMMXXXI) you entered 3031
In Roman numerals(CMXXI) you entered 1121
In Roman numerals(XL) you entered 60

To be honest I dont fancy code in the style you have entered here (no offense), so here is my solution (I have renamed your roman to Roman in the spirit of Java....)

The clue is to 'nibble' out the double character codes first and then the single character codes while you sum up the total.

import java.util.*;

public class RomanNumber {
public final static Hashtable letter2NumberHt=new Hashtable();
static {
letter2NumberHt.put("A", new Integer(1000000));
letter2NumberHt.put("B", new Integer(500000));
letter2NumberHt.put("H", new Integer(100000));
letter2NumberHt.put("F", new Integer(50000));
letter2NumberHt.put("Z", new Integer(10000));
letter2NumberHt.put("Y", new Integer(5000));
letter2NumberHt.put("M", new Integer(1000));
letter2NumberHt.put("CM", new Integer(900));
letter2NumberHt.put("D", new Integer(500));
letter2NumberHt.put("CD", new Integer(400));
letter2NumberHt.put("C", new Integer(100));
letter2NumberHt.put("XC", new Integer(90));
letter2NumberHt.put("L", new Integer(50));
letter2NumberHt.put("XL", new Integer(40));
letter2NumberHt.put("X", new Integer(10));
letter2NumberHt.put("IX", new Integer(9));
letter2NumberHt.put("V", new Integer(5));
letter2NumberHt.put("IV", new Integer(4));
letter2NumberHt.put("I", new Integer(1));
}
private String rNString=null;

private long calculateCharSum (int rcNumLen) {
long aSum=0;
Enumeration en=letter2NumberHt.keys();
while (en.hasMoreElements()) {
String rc = (String)en.nextElement();
if (rc.length()!=rcNumLen) continue;
while(true) {
int ix=rNString.indexOf(rc);
if (ix < 0) break;
aSum+=((Integer)letter2NumberHt.get(rc)).intValue();
rNString=rNString.substring(0,ix)+rNString.substring(ix+rcNumLen);
}
}
return aSum;
}
public long getRomanNumberValue(String rNString) {
this.rNString=rNString;
long sum=0;
sum+=calculateCharSum(2);
sum+=calculateCharSum(1);
System.out.println("value for:"+ rNString+": "+sum);
return sum;
}
public RomanNumber() {}
public static void main(String[] args) {
RomanNumber rn = new RomanNumber();
long value=0;
value=rn.getRomanNumberValue("MMMXXXI");
value=rn.getRomanNumberValue("MMMXLXI");
value=rn.getRomanNumberValue("CMXXI");
value=rn.getRomanNumberValue("XL");
Roman roman=new Roman();
roman.conv1("MMMXLXI");
roman.conv1("MMMXXXI");
roman.conv1("CMXXI");
roman.conv1("XL");
}
}

7. Registered User
Join Date
Sep 2004
Posts
8
I see what you mean. Of course your code if more efficient than mine, however some of the things you used in your code, my class hasn't covered yet. So really, my code is only based on what I know so far. I do appreciate the correction though, how else would I learn?

thanks

8. Senior Member
Join Date
Feb 2004
Posts
541
The problem with your code is that you have the roman numeral system wrong (I think). That is why it is outputing 60 for XL instead of 40.

You can't simply add all the letters up to get the total, because that isn't how roman numerals work. There is also subtracting that needs to be done. If a letter precedes a letter of greater value then you have to take the first letter from the second one. For example 4 is represented by IV, which is read as 5-1. You need to factor that in.

Posting Permissions

• You may not post new threads
• You may not post replies
• You may not post attachments
• You may not edit your posts
•

 FAQ Latest Articles Java .NET XML Database Enterprise