2016-05-31 6 views
-3

ローマ数字を10進数に変換するプログラムを作成することになっています。私は何かをしましたが、数学は間違っています。 MCMLXXVIIIに入ると、私は1978年になって2178年になるはずです。私はこの問題を解決するために部分文字列を使用していますが、私はどこにもいません。誰か私に何をすべきかアドバイスできますか?10進数に変換する

おかげ

#include<iomanip> 
#include<iostream> 
#include<string> 
using namespace std; 

int main(){ 


    int M = 1000; 
    int D = 500; 
    int C = 100; 
    int L = 50; 
    int X = 10; 
    int V = 5; 
    int I = 1; 


    int num = 0; 

    cout << " Enter the Roman Numeral Value: "; 
    string roman; 
    cin >> roman; 

    string sub = roman.substr(0, 2); 
    cout << sub << endl; 





    for (int i = 0; i < roman.length(); i++) 
    { 

     switch (roman.at(i)) 
     { 

     case 'M': 
     case 'm': 
      num += M; 
      break; 
     case 'D': 
     case 'd': 
      num += D; 
      break; 
     case 'C': 
     case 'c': 
      num += C; 
      break; 
     case 'L': 
     case 'l': 
      num += L; 
      break; 
     case 'X': 
     case 'x': 
      num += X; 
      break; 
     case 'V': 
     case 'v': 
      num += V; 
      break; 
     case 'I': 
     case 'i': 
      num += I; 
      break; 
     } 
    } 

    cout << num << endl; 
} 
+0

_'num + = M; '_はぁ?本当に? 'num + = 1000;のようなものではありませんか? –

+0

まだ初心者ですが、私は何をすべきかについて本当に分かりません。 – ProgrammerXYZ

+3

コードはあなたが言ったことを正確に行います。あなたは単にそれらを一緒に加えることによってローマ数字を小数に変換しません。それは彼らがどのように働くかではありません。 C++コードを実装して実装する前に、C++とは何の関係もないローマ数字の仕組みを実際に理解する必要があります。あなたが必要ならば、C++コードを書くことで、ローマ数字に関するすべてのことを学んでから時間をかけてから、[あなたのラバーダックに助けを求める](https://en.wikipedia.org/wiki/Rubber_duck_debugging) –

答えて

1

問題は、シーケンシャルとして文字列を扱っているです。

MCMは、1000 +(1000から100)= 1000ですが、実際にM +(MC)で+ 900 = 1900

Mの+となって

MCMになり、単純にそれを追加してあなたのコード、あなたの代わりに1978年の

2178を取得している、なぜあなたが必要とする何千+ 100 + 1000年== 2100

がいずれかがあるかどうか、あなたが文字に遭遇し、一度かどうかを確認するためのチェックでなりC + Mそれより前の文字は低い値で表示されます。

あなたがCが発生した場合はその前方の文字のいずれかが、あなたはLが発生した場合はCが先にそれがあります場合は、Xが発生した場合は、

をチェックし、チェックM

ているのであれば、チェックLが先行しているなどの場合

はここで動作しているような実装です:

 int Main() 
    { 

     int num = 0; 
     string ignoreNextChar = "false"; 

     string roman = "MCMLXXVIII".ToUpper(); 

     for (int i = 0; i < roman.length(); i++) 
     { 
      if (ignoreNextChar == "true") 
      { 
       ignoreNextChar = "false"; 
       continue; 
      } 
      int anyBloodyNameHere = GetValue(roman.at(i)); 
      if ((i+1) < roman.length()) 
      { 
       int nextVal = GetValue(roman.at(i + 1)); 
       if (nextVal > anyBloodyNameHere) 
       { 
        num += nextVal - anyBloodyNameHere ; 
        ignoreNextChar = "true"; 
        continue; 
       } 
      } 
      num += GetValue(roman.at(i)); 
     } 
     cout << num << endl; 

    } 

    int GetValue(char romanNumeral) 
    { 
     switch (romanNumeral) 
     { 

      case 'M': 
       return 1000; 
      case 'D': 
       return 500; 
      case 'C': 
       return 100; 
      case 'L': 
       return 50; 
      case 'X': 
       return 10; 
      case 'V': 
       return 5; 
      case 'I': 
       return 1; 
     } 
     return 0; 
    } 
+0

どのように動作するのか分かりますが、コードを実際に動作させる方法を知りません。 – ProgrammerXYZ

+0

いくつかのコードを追加しました。これがcsharpだったことに気をつけてください。だから、いくつかの調整が必要かもしれません。 – Ash

+0

私は理解します。ありがとう – ProgrammerXYZ

関連する問題