2

そこで、10 進数を 8 進数に変換するこの小さなアプリケーションを作成しました。正しい答えだけを逆に出力しています。たとえば、変換に対する答えが 17 の場合、アプリケーションはそれを 71 と表示します。

;
    int _tmain(int argc, _TCHAR* argv[])
{   
int octal, total = 0;
    cout<< "please enter a decimal: ";
    cin >> octal;
    while(octal > 0)
    {
                total = octal % 8;
        octal /= 8;
        cout << total;
    }
    cout << endl;
        _getche(); 
        return 0;
}
4

5 に答える 5

4

std::oct を使用して、数値を 8 進数で出力できます。

int n = 123;
std::cout << std::oct << n << std::endl;

std::dec同様に、数値を 10 進数 -や 16 進数 - などの異なる表記で出力できますstd::hex

これらの入出力マニピュレータにより、ユーザーはさまざまな表記法で文字列番号を解析できます。

int n;
std::istringstream("24") >> std::hex >> n;
std::cout << n << std::endl;  // n is 36 (decimal)
于 2013-11-10T18:00:39.930 に答える
1

便利な関数を 2 つ紹介します。変換ごとに文字列を返します。igleyy's answer と同様の行で。

string toOctalFromDecimal (int num) {
    ostringstream o;
    o << std::oct << num;
    return o.str();
}

string toDecimalFromOctal (int num) {
    std::ostringstream o;
    int x;

    std::istringstream(to_string(num)) >> std::oct >> x;
    o << std::dec << x;
    return o.str();
}
于 2015-03-04T16:41:22.150 に答える
1

合計を取り、最終結果を次のように出力する必要があります

int n=0;
while (octal > 0) {
  total += (pow(10,n++))*(octal % 8);
  octal /= 8;
}
cout << total << endl;

最初に最小ビットを印刷しているため、数字を印刷するだけでは逆の順序で印刷されます。

コメントに記載されているように、上記のメカニズムは 10 未満の基数に変換する場合にのみ機能します。

于 2013-11-10T17:52:13.393 に答える
1

一時ストレージに配列を使用するソリューション:

int octal, total = 0, length=0;
char storage[12];   /* 11 octal digits add up to > 1 billion */
octal = 123;
while (octal > 0)
{
  storage[length] = octal % 8;
  octal /= 8;
  length++;
}
while (--length >= 0)
  printf ("%d", storage[length]);
printf ("\n");

(私はたまたま C モードだったので、必要に応じてprintfs. に変更しcoutます。)

最も重要なポイントは、storageサイズに拘束されることです。妥当なサイズに設定できます --整数に入れることができる正の 8 進数の最大サイズは017777777777-- であり、不当なサイズでも許容されます (20 に設定することもできますが、これは追加の 8 バイトを浪費するだけです; 最近では、それは何もありません)。ストレージ サイズは、入力できる最大数の 8 進数での表現の大きさによって決まります。

両方8の を2;に変更するとします。次に、この同じルーチンをバイナリ出力に使用できます。しかし、その時点で、出力文字数は 31 に増加します。int(最後のビットが数値をに切り替えるため、の [可能性の高い] ビット数より 1 少ない。負の数値を処理するには別のコードが必要です。)

10以下のすべてのベース(「ベース10」自体を含む)に対してそのまま機能します。同じコードを拡張して、10 を超える "12 進数" (基数 12) や 16 進数 (基数 16) などを処理する場合は、printf行を変更する必要があります。これにより、コードが base 36 ("sexatrigesimal") まで機能するようになります。慣例により、9 より大きい「数字」は A、B、C などと表記されます。

while (--length >= 0)
  printf ("%c", storage[length] < 10 ? storage[length]+'0' : storage[length]+'A'-10);

(私が書いているときにこれを作成しているので、より多くの入力が必要な別の ではなく、便宜上三項演算子を使用しました。(OTOH、コメントを追加するとゲインが無効になります。まあ、少なくともあなたは三項演算子、およびいくつかの基数の名前。))?..:..if..else


別の解決策は、再帰を使用することです。これは、メモリ内のスペースを事前に割り当てる必要がないため、便利な方法です。代わりに、内部呼び出しスタックに依存します。

原則は、数字の最後の桁のみを出力する関数を作成することですが、そのに、余りが 0 でない限り、数字の余りで自分自身を呼び出します。

そのため、関数はそれ自体を呼び出し、必要な数値を出力します。最初に自分自身を呼び出すため、呼び出されたバージョンは、本来あるべき番号(「元の」関数の桁の左側にある番号) を出力します。印刷する桁がなくなるまで、以下同様です。その時点から、最後に呼び出された関数はその番号 (左端の桁) を出力し、それが呼び出された関数に戻り、その番号 (右にもう 1 つ) を元の番号までずっと出力します。電話。

再帰は習得するのに非常に優れたスキルなので、ぜひ試してみてください!

于 2013-11-10T23:29:42.547 に答える
1

あなたはうまくやっていますが、正しい答えを得るには逆の順序で残りを印刷する必要があります. たとえば、 ans が 17 の場合、10 進数は 1*8^1+7*8^0 になります。unit digit は数値を 8 で割った余りであり、左隣の桁は数値を 8^2 で割った余りであり、以下同様です。したがって、8 進数の数値が n 桁の場合、最上位桁はその数値を 8^n で割った剰余になります。そのため、剰余を逆順に出力する必要があります。

于 2013-11-10T18:09:57.327 に答える