0

再帰的な方法を使用して、英語の形式で整数を1桁ずつ印刷する必要があるという割り当てが与えられました。EG534は「ファイブスリーフォー」を印刷します。

これは私が持っているものです:

int englishInt(int num) {
    if(num < 10) {
        switch(num) {
            case 0: cout << "zero ";
            case 1: cout << "one ";
            case 2: cout << "two ";
            case 3: cout << "three ";
            case 4: cout << "four ";
            case 5: cout << "five ";
            case 6: cout << "six ";
            case 7: cout << "seven ";
            case 8: cout << "eight ";
            case 9: cout << "nine ";
        }
    } else
        return englishInt(num / 10);
}

なんらかの理由で、英語で最下位桁から最上位桁までを印刷しています...これは、最初の桁に到達するまで戻り続けてから印刷し、スタックがほどけるにつれて各桁を印刷しますか?

4

5 に答える 5

4

例を挙げて考えてみてください。たとえば、537です。

englishInt(537) -- prints nothing, calls
    englishInt(53) -- prints nothing, calls
        englishInt(5) -- prints "five six seven eight nine"

理由は次のとおりです。

  1. breakケースにステートメントはありません。
  2. の場合、何も印刷されませんnum >= 10
于 2013-02-25T04:59:54.820 に答える
2

これは、再帰する呼び出しでメソッドが何も実行しないために発生します。num呼び出しごとに印刷を行う必要がありますが、がゼロでない場合にのみ再帰します。

アルゴリズム(擬似コード)は次のようになります。

englishInt(int num) {
    if (num != 0) {
        englishInt(num/10)
    }
    cout << english letter for (num % 10)
}

num == 0を呼び出すenglishInt(0)と出力が生成されるように、の特殊なケースが必要です。

于 2013-02-25T04:59:48.147 に答える
1

まず、コードを修正するための最小限の変更です。

  1. breakスイッチの各出力の後にを追加します。
  2. 出力の前に繰り返し、常に後に出力します。

したがって、

void englishInt(int num)
{
    if (num >=10)
        englishInt(num/10);

    switch(num % 10)
    {
        case 0: cout << "zero "; break;
        case 1: cout << "one "; break;
        case 2: cout << "two "; break;
        case 3: cout << "three "; break;
        case 4: cout << "four "; break;
        case 5: cout << "five "; break;
        case 6: cout << "six "; break;
        case 7: cout << "seven "; break;
        case 8: cout << "eight "; break;
        case 9: cout << "nine "; break;
    }
}

スイッチを捨てる

そもそもswitchステートメントがある理由については説明していません。スイッチを見ると、常にの間の数値を評価しています0..9。それでは、10個の文字列の配列への単純なインデックスにその数値を使用してみませんか。

#include <iostream>
using namespace std;

void print_num(unsigned int num)
{
    static const char *strs[] =
    {
        "zero", "one", "two", "three", "four",
        "five", "six", "seven", "eight", "nine"
    };

    if (num >= 10)
        print_num(num/10);
    cout << strs[num % 10] << ' ';
}

int main(int argc, char *argv[])
{
    print_num(100); cout << endl;
    print_num(12345);  cout << endl;
    print_num(3);  cout << endl;
    print_num(1024*1024*1024); cout << endl;
    return 0;
}

出力

one zero zero 
one two three four five 
three 
one zero seven three seven four one eight two four 
于 2013-02-25T05:07:57.477 に答える
0

コードにはいくつか問題があります。

まず、switchステートメントが壊れています。各ケースの後にステートメントを置くのを忘れたbreakため、再帰の最後に、プログラムは最上位桁を出力し、最大9桁まで繰り返します。

次のように修正します。

   switch(num) {
        case 0: cout << "zero "; break;
        case 1: cout << "one "; break;
        case 2: cout << "two "; break; 
        case 3: cout << "three "; break;
        case 4: cout << "four "; break;
        case 5: cout << "five "; break; 
        case 6: cout << "six "; break;
        case 7: cout << "seven "; break; 
        case 8: cout << "eight "; break;
        case 9: cout << "nine "; break;
    }

次に、プログラムには最上位桁の出力のみがあります。中間ステップでは何も印刷しません。これはコードの問題ではなく、アルゴリズムの問​​題なので、自分で修正する必要があります。

于 2013-02-25T05:13:11.843 に答える
-1

行うためのワイルドな方法

int main()
{
   int n;
   char s[32];
   char word[10][10]{"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};

   cout << "enter a number" << endl;
   cin >> n;

   sprintf(s,"%d", n );

   for( int i = 0; s[i] != '\0'; i++)
   {
       cout << word[s[i]-'0'];
   }

   return 0;
}
于 2013-02-25T05:00:44.907 に答える