csnotes/338/roman/Roman.java
2019-03-15 01:25:45 -07:00

128 lines
2.2 KiB
Java

import java.util.Scanner;
/**
* Roman numerals
* I 1
* V 5
* X 10
* L 50
* C 100
* D 500
* M 1000
*
* Numbers are written in decreasing value
* Example: XII is 12, not IIX or IXI
*
* But there are special rules:
* I can come before V or X IV = 4, IX = 9
* X can come before L or C XL = 40, XC = 90
* C can come before D or M CD = 400 CM = 900
*/
public class Roman {
public static String intToRoman(int n) {
String ret = "";
int val = n;
// dealing with the thousands case
if(n > 1000) {
int m = val / 1000;
for(int i =0;i<m;i++) {
ret += "M";
val -= 1000;
}
}
// 900 case
if(val>=900) {
ret += "CM";
val -= 900;
}
// 600-800 range
if(val>=600) {
int c = (val - 500)/100;
for(int i =0;i<c;i++) {
ret += "C";
}
val -= 500;
}
// special case 500
if(val>=500) {
ret += "D";
val -= 500;
}
// 400 special case
if(val>=400) {
ret +="CD";
val -= 400;
}
// 100 - 300 range
if(val>=100) {
int x = (val - 100)/100;
for(int i =0;i<x;i++) {
ret += "X";
}
val -= 100;
}
// sub 100 range now
// 90 special case first
if(val>=90) {
val -=90;
ret += "XC";
}
if(val>=50) {
ret += "L";
int L=(val-50)/10;
for(int i =0;i<L;i++) {
ret += "X";
}
val -= 50;
}
if(val>=40) {
ret += "XL";
val -= 40;
}
if(val>=10) {
int x = (val - 10)/10;
for(int i =0;i<x;i++) {
ret += "X";
}
val -= 10;
}
if(val==9) {
ret += "IX";
return ret;
}
if(val>5){
int c = (val - 5);
for(int i =0;i<c;i++) {
ret += "I";
}
val -=5;
}
if(val==5) {
ret += "V";
return ret;
}
if(val==4) {
ret += "IV";
return ret;
}
return ret;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (true) {
System.out.print("Enter Roman Number or q for quit. ");
String x = in.nextLine();
if (x.equals("q"))
return;
// now we deal with normal cases
int n = Integer.parseInt(x);
System.out.println(n + " : " + intToRoman(n));
}
}
}