0

こんにちは、C++ でローマ数字を通常の数字に変換する際に問題があります。コードはある程度機能しますが、数字 (XIV 14 または LIV など) を入力すると、15 または 55 が出力されます。find ステートメントを実装しようとしました。ただし、それを使用して問題を解決する方法がわかりません。これまでのコードのコピーです。

int convNum;
int total = 0;
string romanNum;
const string units [10]= {"0","I","II","III","IV","V","VI","VII","VIII","IX"};
const string tens [10]= {"0","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"};
const string hundreds [10]= {"0","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"};
const string thousands [4]= {"0","M","MM","MMM"};
string input;

while(!cin.eof()){
    cin>>romanNum;
    if(cin.fail()){
        break;
    }else{
        for(int i=0; i<romanNum.length(); i++){
            romanNum[i]=toupper(romanNum[i]);
        }
        for(int y=3; y > 0; y--){
           if(romanNum.find(thousands[y])!= string::npos){
               total += y*1000;
               input.erase(0,thousands[y].length());
               break;
            }
        }
        for(int y=9; y > 0; y--){
           if(romanNum.find(hundreds[y])!= string::npos){
               total += y*100;
               input.erase(0,hundreds[y].length());
               break;
            }
        }
        for(int y=9; y > 0; y--){
           if(romanNum.find(tens[y])!= string::npos){
               total += y*10;
               input.erase(0,tens[y].length());
               break;
            } 
        }
        for(int y=9; y > 0; y--){
           if(romanNum.find(units[y])!= string::npos){
               total += y;
               input.erase(0,units[y].length());
               break;
            }
        }
        cout << total << endl;
        total = 0;
           }

        for(int k=0; k < romanNum.length(); k++){
            input[k] = romanNum[k];
        }


        }     


return 0;

}

私は初心者であり、この量の C++ コードをコーディングするには約 2 週間かかりました。

4

2 に答える 2

1

2 つの問題があるようです。

まず、見つけた数字を消去しているときは、input文字列ではなく、文字列から消去していますromanNumromanNum代わりに文字列から消去する必要があります。

romanNum.erase(0, thousands[y].length());

第 2 に、文字列の先頭だけでなく、任意の場所で結果を検索しているように見えます。したがって、「LIV」の例では、リストを検索すると、unitsリストの最後に「V」が見つかり、5 が追加され、「I」が消去されます (常に先頭から消去されるため)。これに対する 1 つの解決策は、現在の文字列の先頭にある結果のみを受け入れることです. したがって、 を実行する代わりに、次の!= string::nposようにします== 0:

if (romanNum.find(thousands[y]) == 0) {
于 2013-08-31T15:12:52.090 に答える
0

デバッグは行いません。3 つの問題を特定するだけです。

  1. で検索してromanNumいますが、 で見つけた文字を消去していますinput。それは同じ文字列であってはなりませんか?

  2. 逆の順序で反復しているためunit、数値で見つかった最初の文字列は"V"ではなくであるため、15 を取得しています。"IV"

  3. 番号のプレフィックスである文字列を探すべきではありませんか? どこにもありません。findメソッドが他のものではなく、0 を返すようにする必要があります。

于 2013-08-31T15:13:01.900 に答える