C中的十进制到八进制

时间:2011-03-19 11:18:53

标签: c decimal octal

我刚开始用K.N King的C编程:现代方法(2ndEdn)教自己C语言。

我很享受,但我希望在适当的时候在这里发出一些奇怪的问题,因为很遗憾,我没有导师,有些人会提出更多问题然后他们回答!

我正在做一个关于输入整数并以八进制显示它的问题。它说有一种简单的方法可以做到,但这本书后面会有。我想出了以下内容:

// 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。

感谢您的时间。 安德鲁

P.S我确实在搜索引擎中查找但是找不到任何以“慢”方式执行的操作!

8 个答案:

答案 0 :(得分:5)

每个人都说得对printf有一种内置的方法。但是自己做呢?

首先想到的是一个八进制数字恰好是三位。因此,您可以通过这种方式进行转换:

  • 循环while n != 0
  • n的最左边3位隔离到d并打印d
  • 向左移动n 3位

代码很简单,但我没有提供,所以你可以自己做(你需要熟悉按位转移 {{3为了做到这一点)。

答案 1 :(得分:4)

简单的方法可能是使用printf()的{​​{1}} format specifier

%o

答案 2 :(得分:3)

其他人发布了真实的生产代码答案,现在我从你的评论中看到你还没有完成循环。也许你的书试图教你递归:

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

这适用于n> 0

答案 3 :(得分:1)

使用循环,您可以像这样卷起五条非常相似的行:

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

d将从8 * 8 * 8 * 8开始,这是您用于n2的除数,然后逐步执行8 * 8 * 88 * 88最后1,这是n6的除数,沿途打印每个数字。

一个好的编译器实际上会通过将它展开回五行来优化它,所以你将得到几乎与你开始时相同的东西。将它写成循环的优点是你不能只在其中一行中犯错。

编译器还将使用3位移位替换8。两者都以二进制形式给出相同的结果,但后者更快。

答案 4 :(得分: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;
}

答案 5 :(得分:0)

%o

中使用printf格式说明符
printf("Enter a number between 0 and 32767: ");
scanf("%d", &n);
printf("%o", n);

答案 6 :(得分:0)

由于只引入了基础知识,所以你不希望(至少在这一点上)使用函数,循环,按位运算符,%o格式说明符和所有这些东西。这是我的基本解决方案:

int n, d1, d2, d3, d4, d5, o;

printf("Enter a number between 0 and 32767: ");
scanf("%d", &n);

d5 = n % 8;
n /= 8;
d4 = n % 8;
n /= 8;
d3 = n % 8;
n /= 8;
d2 = n % 8;
n /= 8;
d1 = n % 8;

o = 10000 * d1 + 1000 * d2 + 100 * d3 + 10 * d4 + d5;

printf("In octal, your number is: %.5d\n", o);

请注意,由于输出中不需要n,因此您可以为每个步骤修改(除)(因此可以节省分数,这在计算上相对昂贵)。您最安全32767(八进制:77777),32768(8 * 8 * 8 * 8 * 8 = 8 ^ 5 =(2 ^ 3)^ 5 = 2 ^ 15)是第一个数字,需要八进制的八位数:100000

这个o变量并不是真正需要的,当int 16位签名(在某个古老的系统上)时,它不会起作用,因此从这一点开始,最好只打印单独的数字。

答案 7 :(得分: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 }