import java.util.Scanner; import java.util.Arrays; /* Online Java - IDE, Code Editor, Compiler // The program can not do VI // MMMIX outbounds error; Online Java is a quick and easy tool that helps you to build, compile, test your programs online. */ public class Main { public static void main(String[] args) { System.out.println("Welcome to Online IDE!! Happy Coding :)"); char[] acceptedNumerals = new char[]{'M','D','C','L','X', 'V','I'}; //These are all accepted roman numerals int number; //This is set once end user specifies number numerals in their number to be inputted boolean noMatch=true; // this flag is used to check if the numeral entered is a valid one int j; //used to increment the character array containing user input of numeral int count=0; // this keeps track number times end user has entered a character. It can be decremented if it fails validation. Scanner reader=null; // This is used to ascertain how many digits end user wants reader = new Scanner(System.in); // Reading from System.in System.out.println("Enter number numerals in the number to be converted to decimal:"); number=reader.nextInt(); char inputtedNumerals[] = new char[number]; // this creates character array with end user specified size int [][] posValues = new int [number][2]; // this is used to keep track of: // this is 2D array. 'number' simply increments with array index of the roman numeral in character array // the multidimensal aspect at 0 index will store: index of which numeral i.e M is 0, D is 1 //aspect at 1 index will store: decimal conversion // This will support later analysis. //all values will be set to 1 to ensure a repeat conversion is not processed; do { reader = new Scanner(System.in); // Reading from System.in System.out.println("Enter roman numeral " + (count+1) + " of " + number + ":"); // end user prompted to enter roman numeral inputtedNumerals[count]=reader.next().charAt(0); count++; for (j=0; j numeralsToString.indexOf(subtractiveNumerals[j])) { //Both these subtractive numerals appear. a case of now checking if range is same System.out.println("This should print out start of the range:" + subtractiveNumeralsRange[i][0]); System.out.println("This should print out end of the range:" + subtractiveNumeralsRange[i][1]); System.out.println("This should print out start of the range:" + subtractiveNumeralsRange[j][0]); System.out.println("This should print out end of the range:" + subtractiveNumeralsRange[j][1]); if (subtractiveNumeralsRange[i][0] == subtractiveNumeralsRange[j][0]) // these subtractive notations are in the same range { System.out.println(subtractiveNumerals[i] + " is in the range: " + subtractiveNumeralsRange[i][0] + " - " + subtractiveNumeralsRange[i][1]); System.out.println(subtractiveNumerals[j] + " is in the range: " + subtractiveNumeralsRange[j][0] + " - " + subtractiveNumeralsRange[j][1]); System.out.println("They are both in the same range"); System.out.println("not sure whats here:" + subtractiveNumerals[i] + " "+ numeralsToString.indexOf(subtractiveNumerals[i])); System.out.println("not sure whats here:" + subtractiveNumerals[j] + " "+ numeralsToString.indexOf(subtractiveNumerals[i+1])); System.out.println("not sure whats here:" + numeralsToString.indexOf(subtractiveNumerals[j])); System.out.println("not sure whats here:" + numeralsToString.indexOf(subtractiveNumerals[j]+1)); processedConversion[numeralsToString.indexOf(subtractiveNumerals[i])]=1; temp = numeralsToString.indexOf(subtractiveNumerals[i]) + 1; processedConversion[temp]=1; processedConversion[numeralsToString.indexOf(subtractiveNumerals[j])]=1; temp = numeralsToString.indexOf(subtractiveNumerals[j]) + 1; processedConversion[temp]=1; rule4=0; } if (subtractiveNumeralsRange[i][0] != subtractiveNumeralsRange[j][0]) // this ensures that subtractive notations are not in the same range { //System.out.println("What is here: " + processedConversion[numeralsToString.indexOf(subtractiveNumerals[i])]); //System.out.println("What is here: " + processedConversion[numeralsToString.indexOf(subtractiveNumerals[j])]); if(processedConversion[numeralsToString.indexOf(subtractiveNumerals[i])]!=1 && processedConversion[numeralsToString.indexOf(subtractiveNumerals[j])]!=1 ) { if (numeralsToString.indexOf(subtractiveNumerals[i])!=-1 && numeralsToString.indexOf(subtractiveNumerals[j])!=-1) { System.out.println("correct order"); correctOrder=true; processedConversion[numeralsToString.indexOf(subtractiveNumerals[i])]=1; //System.out.println("This is value marked with 1: " + posValues[processedConversion[numeralsToString.indexOf(subtractiveNumerals[i])][1]]); temp = numeralsToString.indexOf(subtractiveNumerals[i]) + 1; processedConversion[temp]=1; //System.out.println("This is value marked with 1: " + posValues[processedConversion[numeralsToString.indexOf(subtractiveNumerals[i])+1][1]]); switch (subtractiveNumerals[i]) { case "IV": rule4 = rule4 + 4; break; case "IX": rule4 = rule4 + 9; break; case "XL": rule4 = rule4 + 40; break; case "XC": rule4 = rule4 + 90; break; case "CD": rule4 = rule4 + 400; break; case "CM": rule4 = rule4 + 900; break; default: invalidSubtractiveNumeral = true; } switch (subtractiveNumerals[j]) { case "IV": rule4 = rule4 + 4; break; case "IX": rule4 = rule4 + 9; break; case "XL": rule4 = rule4 + 40; break; case "XC": rule4 = rule4 + 90; break; case "CD": rule4 = rule4 + 400; break; case "CM": rule4 = rule4 + 900; break; default: invalidSubtractiveNumeral = true; } } } } } } } boolean correctOrder=false; System.out.println("total after rule4:" + rule4); // this confirms if a match is found. -1 value is no match. 0 is a match. System.out.println(subtractiveNumerals[i] + " " + numeralsToString.indexOf(subtractiveNumerals[i])); // this now is just simply going through all subtractive notations if there is no other existing // this can not run if the above circumstance is true. if (!twoSubtractiveNotations) { if (numeralsToString.indexOf(subtractiveNumerals[i])!=-1) { if (processedConversion[numeralsToString.indexOf(subtractiveNumerals[i])]!=1) { //System.out.println("It should be here for cases like CM"); processedConversion[numeralsToString.indexOf(subtractiveNumerals[i])]=1; //System.out.println("This is value marked with 1: " + posValues[processedConversion[numeralsToString.indexOf(subtractiveNumerals[i])][1]]); temp = numeralsToString.indexOf(subtractiveNumerals[i]) + 1; processedConversion[temp]=1; //System.out.println("This is value marked with 1: " + posValues[processedConversion[numeralsToString.indexOf(subtractiveNumerals[i]+1)][1]]); // **This is now checking if X for instance is occuring in the numerals and also subtractive notations // ** for instance XCX System.out.println("ASDASDBGDFSDGFDGFDG"); System.out.println(subtractiveNumerals[i]); if (numeralsToString.indexOf(subtractiveNumerals[i])!=-1 && posValues.length>2) // if it finds a match of subtractive notation in the numeral { temp = numeralsToString.indexOf(subtractiveNumerals[i]) + 2; // sets temp to allow comparison 1st with 3rd char System.out.println("first"); } if (numeralsToString.indexOf(subtractiveNumerals[i])!=-1 && posValues.length==2) //this should allow normal flow of app? { temp = numeralsToString.indexOf(subtractiveNumerals[i]) + 1; System.out.println("second"); } System.out.println("temp is currrentl: " + temp); if (temp<=posValues.length) // this ensures that there is a value in numeral to compare against { //This checks XCX first char of subtractivenotation X against 2 positions in main array System.out.println("B:" + numeralsToString.charAt(temp-1)); if (subtractiveNumerals[i].charAt(0) == numeralsToString.charAt(temp) /*&& posValues.length>2*/) { System.out.println("%*%*%*"); System.out.println("The numeral " + numeralsToString.charAt(temp) + " cannot be placed after a group of numerals written in subtractive notation: " + subtractiveNumerals[i]); illegalSubtractive=true; } // this is now checking if such a sequence exists CMM. This is not legal since //subtractive notation CM (900) is less than M (1000). if (posValues.length>2) { if (subtractiveNumeralsRange[i][1]< posValues[temp][1] ) /*&& posValues.length>2*/ { System.out.println("%*%*%*"); System.out.println("A group of numerals written in subtractive notation, of lower value:"); System.out.println(subtractiveNumerals[i] + " ( = " + subtractiveNumeralsRange[i][1] + " ), cannot precede a numeral of larger value "); System.out.println(numeralsToString.charAt(temp) + " ( =" + posValues[temp][1] + ")." ); illegalSubtractive=true; } } switch (subtractiveNumerals[i]) { case "IV": rule4Single = rule4Single + 4; break; case "IX": rule4Single = rule4Single + 9; break; case "XL": rule4Single = rule4Single + 40; break; case "XC": rule4Single = rule4Single + 90; break; case "CD": rule4Single = rule4Single + 400; break; case "CM": rule4Single = rule4Single + 900; break; default: invalidSubtractiveNumeral = true; } System.out.println("Does it even get here"); //System.out.println("This should now print out instances like: " + numeralsToString); System.out.println("It's conversion is:" +rule4Single); twoSubtractiveNotations=false; singleSubtractiveNotations=true; } } } //if (numeralsToString.indexOf(subtractiveNumerals[i])==-1) // { // rule5=0; // System.out.println(numeralsToString + " has an illegal combination of subtractive notations"); //} } } //---------------------------------------------------------------- //} //} // MAIN PROGRAM EXECUTION //this will examine decimal number stored. If identical numerals in consecutive it will add to the total. for (int m=1; m3) // what does this rule mean, first part if (posValues.length>2) // m is current position in the numerals array { if (m!=posValues.length) // can not check for three in row if last element in array { System.out.println("start of rule2"); System.out.println("********************************************************"); System.out.println("What is temp1+2: " + (temp1+2)); System.out.println("What is temp1: " + (temp1)); if (temp1+2<=posValues.length) { System.out.println("££££££££"); System.out.println(temp1); // checking for three in row same if (posValues[temp1][1]==posValues[temp1+1][1] && posValues[temp1+1][1]==posValues[temp1+2][1]) { System.out.println("Three in row are the same"); threeInRow = (posValues[temp1][1] * 3) +threeInRow; System.out.println(threeInRow); processedConversion[temp1]=1; processedConversion[temp1+2]=1; processedConversion[temp1+1]=1; temp1 = temp1+3; System.out.println("Now what is temp1: " + temp1); } if (temp1+2>posValues.length && (posValues.length-4)>temp1) { if (posValues[temp1][1]==posValues[temp1+1][1] && posValues[temp1+1][1]==posValues[temp1+2][1] && posValues[temp1+2][1]==posValues[temp1+3][1]) { System.out.println("There are more than three consecutive same characters: " + acceptedNumerals[posValues[m][0]]); System.out.println("This is invalid roman numeral"); illegalThreeInARowState = true; break; //System.exit(0); } } } } } if (!illegalThreeInARowState) { System.out.println("Amit Amlani"); if (processedConversion[m]!=1 && processedConversion[m-1]!=1) { rule2total=posValues[m][1]+posValues[m-1][1]; rule2=rule2+rule2total; // they will be totalled if same System.out.println("So far sum:" + rule2); rule2State=true; } processedConversion[m]=1; processedConversion[m-1]=1; valueConsecutiveOccurences[m] = posValues[m][1]; //storing decimal value in array. consecutiveOccurrences=consecutiveOccurrences+2; // valueConsecutiveOccurences[m] this keeps a track of the roman numeral that has been repeating //num++; // this checks if there has already been consecutive occurence of the numeral adjacently //[m][0]=numeral position //[m][1]=decimal if (m!=(posValues.length-1)) { if (valueConsecutiveOccurences[m]==posValues[m+1][1] && processedConversion[m+1]!=1) { System.out.println("does this happen45"); rule2=rule2-(rule2total/2); //System.out.println("sum so far: " + sum); rule2total=0; processedConversion[m+1]=1; } } // NEED TO VERIFY THIS if (illegalThreeInARowState) { rule2=0; } } } //Rule 5: When a Roman numeral is placed after another Roman numeral of greater value, //the result is the sum of the numerals. For example, VIII = 5 + 1 + 1 + 1 = 8, or, //XV = 10 + 5 = 15, // This appears to be where the code has determined if numerals are in some decent order System.out.println("What is value of zeroindexcount: " + zeroIndexCount); if (posValues[m][1]10) { System.out.println("Roman Numeral " + numeralsToString.charAt(zeroIndexCount) + "(=" + posValues[zeroIndexCount][1] + ")" + " can not precede: " + numeralsToString.charAt(zeroIndexCount+1) + " (=" + posValues[zeroIndexCount+1][1] + ")"); IplacedIncorrect=true; } if (posValues[zeroIndexCount][1]==10 && posValues[zeroIndexCount+1][1]>100) { System.out.println("Roman Numeral " + numeralsToString.charAt(zeroIndexCount) + "(=" + posValues[zeroIndexCount][1] + ")" + " can not precede: " + numeralsToString.charAt(zeroIndexCount+1) + " (=" + posValues[zeroIndexCount+1][1] + ")"); IplacedIncorrect=true; } if (posValues[zeroIndexCount][1]==5 && posValues[zeroIndexCount+1][1]>5) { System.out.println("Roman Numeral " + numeralsToString.charAt(zeroIndexCount) + "(=" + posValues[zeroIndexCount][1] + ")" + " can not precede: " + numeralsToString.charAt(zeroIndexCount+1) + " (=" + posValues[zeroIndexCount+1][1] + ")"); IplacedIncorrect=true; } if (posValues[zeroIndexCount][1]!=5 && posValues[zeroIndexCount][1]!=50 && posValues[zeroIndexCount][1]!=500 && !IplacedIncorrect) { System.out.println("what are in here exactly:" + posValues[zeroIndexCount][1]); System.out.println("what are in here exactly:" + posValues[zeroIndexCount+1][1]); processedConversion[zeroIndexCount]=1; rule6total = posValues[zeroIndexCount+1][1] - posValues[zeroIndexCount][1]; rule6 = rule6total + rule6; rule6total = 0; rule6State=true; } else { System.out.println("Illegal subtractive notation found with V, D or L"); rule5=0; illegalSubtractive=true; } } // Rule 7: When a Roman numeral of a smaller value is placed between two numerals of greater value, //it is subtracted from the numeral on its right. For example, XIV = 10 + (5 - 1) = 14, //or, XIX = 10 + (10 - 1) = 19 System.out.println("Rule 7"); // rule 7 will not stall by rule 4 since the the right hand side character in rule 4 is always bigger. if (m!=posValues.length && posValues.length>2) // a numeral can not be in middle if it is the last in the numeral array // it also can not be in middle if the first numeral. Hence using m index notation. { if (processedConversion[m]!=1) { //START FROM HERE AND TEST XI if (m!=posValues.length-1) { if (posValues[m][1]1 || countL>1 || countV>1) { System.out.println("Invalid roman numeral. Numeral V or D or L has occured more than once"); rule3Fail = true; } if (inputtedNumerals.length==2) // checking number with 2 numerals { if (posValues[0][0]==posValues[1][0] && rule3Fail==false) // if values identical straight forward conversion { twoNumerals = posValues[0][1] + posValues[1][1]; System.out.println("Conversion is double:" + (twoNumerals)); //System.out.println("XL: " + posValues[0][1]); processedConversion[0]=1; processedConversion[1]=1; //System.out.println("This is value marked with 1: " + posValues[1][1]); } } System.out.println("number of Vs: " + countV); System.out.println("number of Ls: " + countL); System.out.println("number of Ds: " + countD); System.out.println("rule4: " + rule4); System.out.println("rule2: " + rule2); System.out.println("rule4Single: " + rule4Single); System.out.println("rule5: " + rule5); System.out.println("rule6: " + rule6); System.out.println("rule7: " + rule7); System.out.println("threeinarow:" + threeInRow); System.out.println("Untotal:" + unTotal); if (!illegalSubtractive && !IplacedIncorrect && !illegalThreeInARowState && !rule3Fail) { if (rule4Single!=0 && unTotal!=0) { System.out.println("total567: " + (rule4Single + unTotal)); System.exit(0); } if (rule4Single!=0 && rule2!=0 && rule5!=0) { System.out.println("total5647: " + (rule4Single + rule2 + rule5)); System.exit(0); } if (rule4Single==0 && rule2!=0 && rule5!=0 && rule4!=0) { System.out.println("total5647: " + (rule4 + rule2 + rule5)); System.exit(0); } if (unTotal==0 && rule5==0 && rule2==0 && rule4==0 && threeInRow!=0) { System.out.println("Triple: " + (threeInRow)); System.exit(0); } if (unTotal!=0 && rule5!=0 && rule2!=0) { System.out.println("Total herejj: " + (unTotal+rule5 + rule2)); System.exit(0); } if (unTotal!=0 && rule5!=0) { System.out.println("Total here is1: " + (unTotal+rule5)); System.exit(0); } if (unTotal!=0 && rule5==0 && rule2==0 && rule4==0 && threeInRow!=0) { System.out.println("Total here is1: " + (unTotal+threeInRow)); System.exit(0); } if (rule2!=0 && rule4Single==0 && rule5==0 && rule6==0 && threeInRow!=0) { System.out.println("Long total: " + (threeInRow+rule2)); System.exit(0); } if (rule2!=0 && rule4Single==0 && rule5==0 && rule6==0 && unTotal!=0) { System.out.println("Long total: " + (rule2+unTotal)); System.exit(0); } if (rule2!=0 && rule4Single==0 && rule5==0 && rule6==0) { System.out.println("Long total: " + rule2); System.exit(0); } if (rule4Single!=0 && rule5!=0 && rule6!=0) { System.out.println("Total here is not before: " + (rule4Single+rule5)); System.exit(0); } if (unTotal!=0 && rule5==0 && rule2==0 && rule4==0 && rule4Single==0) { System.out.println("Total here is2: " + (unTotal)); System.exit(0); } if (unTotal!=0 && rule4!=0) { System.out.println("Total here is3: " + (unTotal + rule4)); System.exit(0); } if (rule5!=0 && rule6!=0 && unTotal!=0) { System.out.println(numeralsToString + "is an invalid roman numeral"); System.exit(0); } if (rule6!=0 && rule5!=0) { System.out.println("Total here is111: " + (rule6+rule5)); System.exit(0); } if (rule3Fail) { System.out.println("More than 2 instances of V, L and D:"); System.out.println("D: " + countD); System.out.println("V: " + countV); System.out.println("L: " + countL); System.exit(0); } if (rule6!=0 && rule2!=0) { System.out.println("Total here is4: " + (rule6+rule2)); System.exit(0); } if (rule5!=0 && rule2!=0 && threeInRow==0 && rule4Single!=0) { System.out.println("Total this is: " + (rule5+rule2)); System.exit(0); } if (rule5!=0 && rule2!=0 && threeInRow!=0) { System.out.println("Total199 is: " + (rule5+rule2)); System.exit(0); } // if (rule5!=0 && rule2!=0) //{ // System.out.println("Total99 is: " + (rule5+(rule2/2))); // System.exit(0); //} if (rule5!=0 && rule2!=0) { System.out.println("Total99 is: " + (rule5+rule2)); System.exit(0); } if (rule5!=0 && unTotal!=0) { System.out.println("Total-- is: " + (rule5+unTotal)); System.exit(0); } if (rule5!=0 && rule4!=0) { System.out.println("Total ggg is: " + (rule5 + rule4)); System.exit(0); } if (rule5!=0 && threeInRow!=0 && rule4Single!=0) { System.out.println("Total3 is: " + (rule5+threeInRow)); System.exit(0); } if (rule5!=0 && threeInRow!=0) { System.out.println("Total3 is: " + (rule5+threeInRow)); System.exit(0); } if (rule5!=0) { System.out.println("Total3 is: " + (rule5)); System.exit(0); } if (rule2!=0 && unTotal!=0 && rule4Single!=0) { System.out.println("Total1 is: " + (rule2 + unTotal + rule4Single)); System.exit(0); } if (rule2!=0 && rule4Single!=0) { System.out.println("Total1 is: " + (rule2 + rule4Single)); System.exit(0); } if (rule2!=0) { System.out.println("Total1 is: " + (twoNumerals)); System.exit(0); } if (rule4Single!=0) { System.out.println("Total4 is: " + (unTotal + rule4Single)); System.exit(0); } if (rule4!=0) { System.out.println("Total4 is: " + (rule4)); System.exit(0); } } System.out.println("Address the issues outputted for a valid Roman numeral"); //System.out.println("this is the overall sum: " + (rule2+rule4Single+rule5+rule6+rule7)); // System.out.println("this is the overall sum: " + (rule5 + rule2)); // This is the best logic found on the internet for roman numeral conversion. // Logic will be coded one by one and see if it works overall /* It is necessary for us to remember the rules for reading and writing Roman numbers in order to avoid mistakes. Here is a list of the basic rules for Roman numerals. Rule 1: When certain numerals are repeated, the number represented by them is their sum. For example, II = 1 + 1 = 2, or XX = 10 + 10 = 20, or, XXX = 10 + 10 + 10 = 30. Rule 2: It is to be noted that no Roman numerals can come together more than 3 times. For example, we cannot write 40 as XXXX Rule 3: The letters V, L, and D are not repeated. Rule 4: Only I, X, and C can be used as subtractive numerals. There can be 6 combinations when we subtract. These are IV = 5 - 1 = 4; IX = 10 - 1 = 9; XL = 50 - 10 = 40; XC = 100 - 10 = 90; CD = 500 - 100 = 400; and CM = 1000 - 100 = 900 Rule 5: When a Roman numeral is placed after another Roman numeral of greater value, the result is the sum of the numerals. For example, VIII = 5 + 1 + 1 + 1 = 8, or, XV = 10 + 5 = 15, Rule 6: When a Roman numeral is placed before another Roman numeral of greater value, the result is the difference between the numerals. For example, IV = 5 - 1 = 4, or, XL = 50 - 10 = 40, or XC = 100 - 10 = 90 Rule 7: When a Roman numeral of a smaller value is placed between two numerals of greater value, it is subtracted from the numeral on its right. For example, XIV = 10 + (5 - 1) = 14, or, XIX = 10 + (10 - 1) = 19 Rule 8: To multiply a number by a factor of 1000 a bar is placed over it. Rule 9: Roman numerals do not follow any place value system. Rule 10: There is no Roman numeral for zero (0). */ } }