2014-10-10 95 views
1

所以我有一个家庭作业,我必须能够取Roman numeral,反之亦然。我知道如何从数字到字母,但是给数字的字母让我感到困惑。我需要帮助,因为我编写了我的程序和罗马数字来编号。例如,如果我尝试做,XCIX == 99,我得到199。但如果我做的罗马数字2014,那是有效的。另外如果我只输入一个字母,我会得到0。我只需要帮助了解我需要做什么来解决问题。将罗马数字转换为数字逻辑错误java

import java.util.HashMap; 
import java.util.Scanner; 

public class Apweek2 { 

public static void main(String[] args) { 
    Scanner userinput = new Scanner(System.in); 
    System.out.print("enter a number to convert to roman numerals: "); 
    int input = userinput.nextInt(); 

    String[] rv = { "I", "IV", "V", "IX", "X", "XL", "L", "XC", "C", "CD", 
      "D", "CM", "M" }; 
    int[] values_for_rv = { 1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 
      1000 }; 

    System.out.print("enter a roman numeral: "); 
    String roman_numeral = userinput.next(); 

    int sum = 0; 
    String two_spot = null; 
    String last_value = null; 
    for (int i = 1, j = 0; j < roman_numeral.length() 
      && i < roman_numeral.length(); i++, j++) { 

     last_value = roman_numeral.substring(j, i); 

     char roman_noodles = roman_numeral.charAt(i); 
     char raman_noodles = roman_numeral.charAt(j); 

     String roman_values = Character.toString(roman_noodles); 

     two_spot = last_value + roman_values; 

     if (two_spot.contains(rv[1])) { 
      sum = sum + values_for_rv[1]; 
     } 
     if (two_spot.contains(rv[3])) { 
      sum = sum + values_for_rv[3]; 
     } 
     if (two_spot.contains(rv[5])) { 
      sum = sum + values_for_rv[5]; 
     } 
     if (two_spot.contains(rv[7])) { 
      sum = sum + values_for_rv[7]; 
     } 
     if (two_spot.contains(rv[9])) { 
      sum = sum + values_for_rv[9]; 
     } 
     if (two_spot.contains(rv[11])) { 
      sum = sum + values_for_rv[11]; 
     } 

     if (!(two_spot.equals(rv[1])) && !(two_spot.equals(rv[3])) 
       && !(two_spot.equals(rv[5])) && !(two_spot.equals(rv[7])) 
       && !(two_spot.equals(rv[9])) && !(two_spot.equals(rv[11]))) { 

      if (raman_noodles == 'I') { 
       sum = sum + 1; 
      } 
      if (raman_noodles == 'V') { 
       sum = sum + 5; 
      } 
      if (raman_noodles == 'X') { 
       sum = sum + 10; 
      } 
      if (raman_noodles == 'L') { 
       sum = sum + 50; 
      } 
      if (raman_noodles == 'C') { 
       sum = sum + 100; 
      } 
      if (raman_noodles == 'D') { 
       sum = sum + 500; 
      } 
      if (raman_noodles == 'M') { 
       sum = sum + 1000; 
      } 

     } 

    } 
    System.out.println("converted roman numeral is: " + sum); 

    String inputconversion = inputtoroman(input); 

    System.out.print("Converted number is: " + inputconversion); 
} 

public static String inputtoroman(int x) { 

    String s1 = ""; 
    String s2 = ""; 
    String s3 = ""; 
    String s4 = ""; 
    String s5 = ""; 
    String s6 = ""; 
    String s7 = ""; 
    String s8 = ""; 
    String s9 = ""; 
    String s10 = ""; 
    String s11 = ""; 
    String s12 = ""; 
    String s13 = ""; 

    while (x >= 1000) { 
     s1 += "M"; 
     x -= 1000; 
    } 
    while (x >= 900) { 
     s2 += "CM"; 
     x -= 900; 
    } 
    while (x >= 500) { 
     s3 += "D"; 
     x -= 500; 
    } 
    while (x >= 400) { 
     s4 += "CD"; 
     x -= 400; 
    } 
    while (x >= 100) { 
     s5 += "C"; 
     x -= 100; 
    } 
    while (x >= 90) { 
     s6 += "XC"; 
     x -= 90; 
    } 
    while (x >= 50) { 
     s7 += "L"; 
     x -= 50; 
    } 
    while (x >= 40) { 
     s8 += "XL"; 
     x -= 40; 
    } 
    while (x >= 10) { 
     s9 += "X"; 
     x -= 10; 
    } 
    while (x >= 9) { 
     s10 += "IX"; 
     x -= 9; 
    } 
    while (x >= 5) { 
     s11 += "V"; 
     x -= 5; 
    } 
    while (x >= 4) { 
     s12 += "IV"; 
     x -= 4; 
    } 
    while (x >= 1) { 
     s13 += "I"; 
     x -= 1; 
    } 
    String combined = s1 + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10 
      + s11 + s12 + s13; 
    return combined; 

} 
} 

回答

0

所以,我终于想通了我的问题,在我的代码,我不得不两次增加索引整个two_spot时,我找到了一个匹配的罗马数字是有2个值IV一样过一个。然后,我还必须找到最后一个值并计算它,因为for循环只能正确使用。然后,如果它没有找到像IV那样的匹配值,我也必须再次增加该值两次。因此,我通过两个成对的字符串进行移动,并计算成对,除非字符串具有奇数长度。它计算字符串中的最后一个值,并继续进行所有偶数值。最后,如果任何人需要帮助转换罗马数字,并且是java的初学者,这应该有所帮助。

import java.util.Scanner; 

public class Apweek2 { 

public static void main(String[] args) { 
    Scanner userinput = new Scanner(System.in); 
    System.out.print("enter a number to convert to roman numerals: "); 
    int input = userinput.nextInt(); 

    String[] rv = { "I", "IV", "V", "IX", "X", "XL", "L", "XC", "C", "CD", 
      "D", "CM", "M" }; 
    int[] values_for_rv = { 1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 
      1000 }; 

    System.out.print("enter a roman numeral: "); 
    String roman_numeral = userinput.next().toUpperCase(); 


    int sum = 0; 

    if (roman_numeral.length() % 2 == 0) { 

    } else { 
     char odd_value = roman_numeral.charAt(roman_numeral.length() - 1); 
     if (odd_value == 'I') { 
      sum = sum + 1; 
     } 
     if (odd_value == 'V') { 
      sum = sum + 5; 
     } 
     if (odd_value == 'X') { 
      sum = sum + 10; 
     } 
     if (odd_value == 'L') { 
      sum = sum + 50; 
     } 
     if (odd_value == 'C') { 
      sum = sum + 100; 
     } 
     if (odd_value == 'D') { 
      sum = sum + 500; 
     } 
     if (odd_value == 'M') { 
      sum = sum + 1000; 
     } 
    } 

    String two_spot = null; 
    String last_value = null; 
    for (int i = 1, j = 0; j < roman_numeral.length() 
      && i < roman_numeral.length(); i++, j++) { 

     last_value = roman_numeral.substring(j, i); 

     char roman_noodles = roman_numeral.charAt(i); 

     String roman_values = Character.toString(roman_noodles); 

     two_spot = last_value + roman_values; 

     if (two_spot.contains(rv[1])) { 
      sum = sum + values_for_rv[1]; 
      i++; 
      j++; 
     } 
     if (two_spot.contains(rv[3])) { 
      sum = sum + values_for_rv[3]; 
      i++; 
      j++; 
     } 
     if (two_spot.contains(rv[5])) { 
      sum = sum + values_for_rv[5]; 
      i++; 
      j++; 
     } 
     if (two_spot.contains(rv[7])) { 
      sum = sum + values_for_rv[7]; 
      i++; 
      j++; 
     } 
     if (two_spot.contains(rv[9])) { 
      sum = sum + values_for_rv[9]; 
      i++; 
      j++; 
     } 
     if (two_spot.contains(rv[11])) { 
      sum = sum + values_for_rv[11]; 
      i++; 
      j++; 
     } 

     if (!(two_spot.equals(rv[1])) && !(two_spot.equals(rv[3])) 
       && !(two_spot.equals(rv[5])) && !(two_spot.equals(rv[7])) 
       && !(two_spot.equals(rv[9])) && !(two_spot.equals(rv[11]))) { 

      for (int k = 0; k < two_spot.length(); k++) { 

       char raman_noodles = two_spot.charAt(k); 

       if (raman_noodles == 'I') { 
        sum = sum + 1; 
       } 
       if (raman_noodles == 'V') { 
        sum = sum + 5; 
       } 
       if (raman_noodles == 'X') { 
        sum = sum + 10; 
       } 
       if (raman_noodles == 'L') { 
        sum = sum + 50; 
       } 
       if (raman_noodles == 'C') { 
        sum = sum + 100; 
       } 
       if (raman_noodles == 'D') { 
        sum = sum + 500; 
       } 
       if (raman_noodles == 'M') { 
        sum = sum + 1000; 
       } 

      } 
      i++; 
      j++; 
     } 

    } 
    System.out.println("Converted roman numeral to number is: "+sum); 

    String inputconversion = inputtoroman(input); 

    System.out.print("Converted number is: " + inputconversion); 
} 

public static String inputtoroman(int x) { 

    String s1 = ""; 
    String s2 = ""; 
    String s3 = ""; 
    String s4 = ""; 
    String s5 = ""; 
    String s6 = ""; 
    String s7 = ""; 
    String s8 = ""; 
    String s9 = ""; 
    String s10 = ""; 
    String s11 = ""; 
    String s12 = ""; 
    String s13 = ""; 

    while (x >= 1000) { 
     s1 += "M"; 
     x -= 1000; 
    } 
    while (x >= 900) { 
     s2 += "CM"; 
     x -= 900; 
    } 
    while (x >= 500) { 
     s3 += "D"; 
     x -= 500; 
    } 
    while (x >= 400) { 
     s4 += "CD"; 
     x -= 400; 
    } 
    while (x >= 100) { 
     s5 += "C"; 
     x -= 100; 
    } 
    while (x >= 90) { 
     s6 += "XC"; 
     x -= 90; 
    } 
    while (x >= 50) { 
     s7 += "L"; 
     x -= 50; 
    } 
    while (x >= 40) { 
     s8 += "XL"; 
     x -= 40; 
    } 
    while (x >= 10) { 
     s9 += "X"; 
     x -= 10; 
    } 
    while (x >= 9) { 
     s10 += "IX"; 
     x -= 9; 
    } 
    while (x >= 5) { 
     s11 += "V"; 
     x -= 5; 
    } 
    while (x >= 4) { 
     s12 += "IV"; 
     x -= 4; 
    } 
    while (x >= 1) { 
     s13 += "I"; 
     x -= 1; 
    } 
    String combined = s1 + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10 
      + s11 + s12 + s13; 
    return combined; 

    } 

} 
2

你从1开始,所以当你只输入1个数字时,它根本不会进入循环。应该更改为与roman_numeral的全长进行比较。

for (int i = 1, j = 0; j < roman_numeral.length() 
     && i <= roman_numeral.length(); i++, j++) { 

这可能会影响它如何循环,但我现在不能自己运行它。

编辑:其实,这又找,我已经可以看到它要崩溃的char roman_noodles = roman_numeral.charAt(i);

你需要添加一些额外的逻辑,如果你想它来检查只需1个字符。