5

KN King の C Programming: A Modern Approach (2ndEdn) から C を独学で学び始めたところです。

私はそれを楽しんでいますが、残念ながら家庭教師がいないため、適切な場合はアドバイスのためにここに奇妙な質問を投稿したいと考えています。

入力された整数を8進数で表示することについて質問しています。それを行う簡単な方法があると書かれていますが、それは本の後半に記載されています。私は次のことを思いつきました:

// Convert a number to octal

int n, n2, n3, n4, n5, n6;

printf("Enter a number between 0 and 32767: ");

scanf("%d", &n);

n6 = n % 8;
n5 = (n / 8) % 8;
n4 = ((n / 8) / 8) % 8;
n3 = (((n / 8) / 8) / 8) % 8;
n2 = ((((n / 8) / 8) / 8) / 8) % 8;

printf("%d%d%d%d%d", n2, n3, n4, n5, n6);

それは問題なく動作しますが、私は数学が苦手で、これを行うためのより効率的な方法があるかどうか、または可能な唯一の方法でそれを行っているかどうか疑問に思っていました...

他の誰かがその本を持っているとしたら、それは Q4 p.71 です。

御時間ありがとうございます。アンドリュー

PS検索エンジンを調べましたが、この「遅い」方法で実行しているものは見つかりませんでした!

4

9 に答える 9

5

でそれを行う組み込みの方法があると言うのは誰もが正しいですprintf。しかし、それを自分で行うのはどうですか?

最初に思いついたのは、8 進数の 1 桁が正確に 3 ビットであるということです。したがって、次の方法で変換を行うことができます。

  • ループwhile n != 0
  • の左端の 3 ビットを分離してn出力dするd
  • n左に3ビットシフト

コードは簡単ですが、ここでは提供していないので、自分で実行できます (実行するには、ビット演算子とシフト演算子に精通している必要あります )

于 2011-03-19T11:25:35.073 に答える
4

簡単な方法は、おそらくprintf()%o フォーマット指定子を使用することです:

scanf("%d", &n);
printf("%o", n);
于 2011-03-19T11:21:30.497 に答える
3

他の人が実際の本番コードの回答を投稿しましたが、コメントから、まだループを行っていないことがわかります。おそらく、あなたの本は再帰について教えようとしているでしょう:

void print_oct(int n)
{
    if (n != 0) {
        print_oct(n / 8);
        printf("%d", n % 8);
    }
}

これは n > 0 で機能します。

于 2011-03-19T11:34:27.410 に答える
1
/* Converts a positive base_10 into base_b */
int DecimalToBase(int n, int b)
{
    int rslt=0, digitPos=1;
    while (n)
    {
        rslt += (n%b)*digitPos;
        n /= b;
        digitPos *= 10;
    }
    return rslt;
}
于 2013-01-19T16:00:21.297 に答える
1

ループを使用すると、次のように 5 つの非常によく似た行をまとめることができます。

for (int d = 8 * 8 * 8 * 8; d > 0; d /= 8)
    printf("%d", n / d % 8);
printf("\n");

d8 * 8 * 8 * 8は、 に使用する除数であるから始まり、、、最後に の除数である をn2通過し、途中で各桁を出力します。8 * 8 * 88 * 881n6

優れたコンパイラは、実際にこれを 5 行に展開して最適化するため、開始時とほぼ同じ結果が得られます。ループで書くメリットは、1行でも間違えないことです。

コンパイラは、8 による除算を 3 ビットのシフトに置き換える処理も行います。どちらもバイナリで同じ結果を返しますが、後者の方が高速です。

于 2011-03-19T12:12:15.390 に答える
0

C 言語で 10 進数を 8 進数に変換する

#include<stdio.h>
#include<conio.h>
void main()
{
    A:
    long int n,n1,m=1,rem,ans=0;
    clrscr();
    printf("\nEnter Your Decimal No :: ");
    scanf("%ld",&n);

    n1=n;
    while(n>0)
    {
        rem=n%8;
        ans=(rem*m)+ans;
        n=n/8;
        m=m*10;
    }

    printf("\nYour Decimal No is :: %ld",n1);
    printf("\nConvert into Octal No is :: %ld",ans);

    printf("\n\nPress 0 to Continue...");
    if(getch()=='0')
        goto A;
    printf("\n\n\n\tThank You");
    getch();
}
于 2015-08-27T10:29:59.640 に答える
0

%o内部で書式指定子を使用するprintf

printf("Enter a number between 0 and 32767: ");
scanf("%d", &n);
printf("%o", n);
于 2011-03-19T11:24:54.433 に答える
0

既存の回答は、私の好みには十分ではありません。これが私のものです:

#include <stdio.h>

#define OCTALBASE    8
#define OCTALSIZE    8

int main(int argc, char **argv) {
  int indecimal = 1337;
  char output[OCTALSIZE + 1];
  output[OCTALSIZE] = '\0';

  int outindex = OCTALSIZE;
  int outdigit = 0;
  int outvalue = indecimal;
  while (--outindex >= 0) {
    outdigit = outvalue % OCTALBASE;
    if (outvalue > 0 || outdigit > 0)
      { output[outindex] = '0' + outdigit; }
    else { output[outindex] = ' '; }
    outvalue /= OCTALBASE;
  }

  fprintf(stdout, "{ DEC: %8d, OCT: %s }\n", indecimal, output);
  fflush(stdout);

  return 0;
}

結果:

{ DEC:     1337, OCT:     2471 }
于 2014-11-21T07:18:55.870 に答える