将罗马数字转换为数字逻辑错误java

将罗马数字转换为数字逻辑错误java,java,arrays,Java,Arrays,所以我有一个家庭作业,我必须能够把一个罗马数字转换成相反的数字。我知道如何从数字到字母,但字母到数字把我搞糊涂了。我需要帮助,因为我写了我的程序和罗马数字来给这类作品编号。例如,如果我尝试执行,XCIX==99,我会得到199。但如果我用罗马数字表示2014年,那就行了。另外,如果我只输入一个字母,我会得到0。我只是需要帮助理解我需要做什么来解决问题 import java.util.HashMap; import java.util.Scanner; public class Apweek2

所以我有一个家庭作业,我必须能够把一个
罗马数字
转换成相反的数字。我知道如何从数字到字母,但字母到数字把我搞糊涂了。我需要帮助,因为我写了我的程序和罗马数字来给这类作品编号。例如,如果我尝试执行,
XCIX==99
,我会得到
199
。但如果我用罗马数字表示2014年,那就行了。另外,如果我只输入一个字母,我会得到
0
。我只是需要帮助理解我需要做什么来解决问题

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;

}
}
import java.util.HashMap;
导入java.util.Scanner;
公共类Apweek2{
公共静态void main(字符串[]args){
扫描仪用户输入=新扫描仪(System.in);
System.out.print(“输入要转换为罗马数字的数字:”);
int input=userinput.nextInt();
字符串[]rv={“I”、“IV”、“V”、“IX”、“X”、“XL”、“L”、“XC”、“C”、“CD”,
“D”、“CM”、“M”};
int[]值_为_rv={1,4,5,9,10,40,50,90,100,400,500,900,
1000 };
System.out.print(“输入罗马数字:”);
字符串roman_numeric=userinput.next();
整数和=0;
字符串two_spot=null;
字符串last_值=null;
对于(int i=1,j=0;j<罗马数字长度()
&&i<罗马数字.length();i++,j++){
最后一个数值=罗马数字子串(j,i);
char罗马面=罗马数字charAt(i);
char raman_面条=罗马数字charAt(j);
字符串roman_值=Character.toString(roman_);
两个点=最后一个值+罗马值;
如果(两个点包含(rv[1])){
sum=sum+值,用于_rv[1];
}
如果(两个点包含(rv[3])){
sum=sum+值,用于_rv[3];
}
如果(两个点包含(rv[5])){
sum=sum+值,用于_rv[5];
}
如果(两个点包含(rv[7])){
sum=sum+值,用于_rv[7];
}
如果(两个点包含(rv[9])){
sum=sum+值,用于_rv[9];
}
如果(两个点包含(rv[11])){
sum=sum+值,用于_rv[11];
}
如果(!(两点等于(rv[1])和(!(两点等于(rv[3]))
&&!(两个点等于(rv[5])和&!(两个点等于(rv[7]))
&&!(二点等于(rv[9])和&(二点等于(rv[11])){
if(raman_面条=='I'){
总和=总和+1;
}
if(raman_面条=='V'){
总和=总和+5;
}
if(raman_=X'){
总和=总和+10;
}
如果(raman_面条=='L'){
总和=总和+50;
}
if(raman_面条=='C'){
总和=总和+100;
}
if(raman_面条=='D'){
总和=总和+500;
}
if(raman_面条=='M'){
总和=总和+1000;
}
}
}
System.out.println(“转换后的罗马数字为:“+sum”);
字符串inputconversion=InputOroman(输入);
系统输出打印(“转换数为:“+inputconversion”);
}
公共静态字符串inputoroman(int x){
字符串s1=“”;
字符串s2=“”;
字符串s3=“”;
字符串s4=“”;
字符串s5=“”;
字符串s6=“”;
字符串s7=“”;
字符串s8=“”;
字符串s9=“”;
字符串s10=“”;
字符串s11=“”;
字符串s12=“”;
字符串s13=“”;
而(x>=1000){
s1+=“M”;
x-=1000;
}
而(x>=900){
s2+=“厘米”;
x-=900;
}
而(x>=500){
s3+=“D”;
x-=500;
}
而(x>=400){
s4+=“CD”;
x-=400;
}
而(x>=100){
s5+=“C”;
x-=100;
}
而(x>=90){
s6+=“XC”;
x-=90;
}
而(x>=50){
s7+=“L”;
x-=50;
}
而(x>=40){
s8+=“XL”;
x-=40;
}
而(x>=10){
s9+=“X”;
x-=10;
}
而(x>=9){
s10+=“IX”;
x-=9;
}
而(x>=5){
s11+=“V”;
x-=5;
}
而(x>=4){
s12+=“IV”;
x-=4;
}
而(x>=1){
s13+=“I”;
x-=1;
}
组合字符串=s1+s2+s3+s4+s5+s6+s7+s8+s9+s10
+s11+s12+s13;
综合收益;
}
}

您从1开始输入i,因此当您只输入1个数字时,它根本不会进入循环。应更改为与
罗马数字的全长比较

for (int i = 1, j = 0; j < roman_numeral.length()
        && i <= roman_numeral.length(); i++, j++) {
for(int i=1,j=0;j<罗马数字长度()

&&我所以我最终解决了我代码中的问题,当我发现一个匹配的罗马数字有两个值,如IV时,我必须为整个2_点增加两次索引。然后我还必须找到最后一个值并计算它,因为for循环只正确地执行了evens。然后我还必须再次增加值如果找不到与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;

  }

}
import java.util.Scanner;
公共类Apweek2{
公共静态void main(字符串[]args){
扫描仪用户输入=新扫描仪(System.in);
System.out.print(“输入要转换为罗马数字的数字:”);
int input=userinput.nextInt();
字符串[]rv={“I”、“IV”、“V”、“IX”、“X”、“XL”、“L”、“XC”、“C”、“CD”,
“D”、“CM”、“M”};
int[]值_为_rv={1,4,5,9,10,40,50,90,100,400,500,900,
1000 };
System.out.print(“输入罗马数字:”);
字符串罗马数字=