将八进制数转换为C中的十进制数

时间:2015-09-22 14:26:36

标签: c octal

#include <stdio.h>
#include <math.h>

void main() {
    long int on, temp;
    int dn = 0, e = 0, digit;
    printf("Enter octal number : ");
    scanf("%ld", &on);
    temp = on;
    while (on != 0) {
        digit = on % 10;
        dn += digit * pow(8, e);
        e++;
        on /= 10;
    }
    printf("octal number = %ld \n", temp);
    printf("Decimal number= %d  \n", dn);

    return 1;
}

嗨,美好的一天。我有这个代码将八进制数转换为十进制,但我的问题/问题是如何制作一个将转换八进制十进制数的代码。例如:

0.75 8 →___ 10

0.00001 8 →___ 10

在转换中,您必须将每个数字乘以8的平方(8,64,542 ...)

我需要帮助。

4 个答案:

答案 0 :(得分:6)

不要这样做。

将用户的数据读入char*缓冲区。

然后使用strtoul();指定基数为8。

答案 1 :(得分:3)

这是一个程序,它将输入一个小数八进制数并将其转换为浮点值。一个八进制点和至少一个后续数字是必需的,所以不要期望这对像&#34; 100&#34;这样的输入起作用。或&#34; 100。&#34;

#include <stdio.h>
int main() {
  unsigned int integer_part, fraction_part, len1, len2;
  double result;
  scanf("%o.%n%o%n", &integer_part, &len1, &fraction_part, &len2);
  result = fraction_part * 1.0 / (1<<(len2-len1)*3);
  result += integer_part;
  printf("%.6f\n",result);
  return 0;
}

示例:

$ ./oct <<<"0.75"
0.953125
$ ./oct <<<"100.1"
64.125000

如果你想接受更广泛的输入(包括整数),那么你最好阅读整行文本并逐步解析它。

答案 2 :(得分:2)

您可以将数据读取为八进制格式。

#include<stdio.h>
#include<math.h>
int main()
{
    unsigned on;
    printf("Enter octal number : ");
    scanf("%o",&on);
    printf("octal number = %o \n",on);
    printf("Decimal number= %d  \n",on);
    return 0;
}

从字面上看,您如何阅读数据或显示数据,内部表示对于所有十六进制,八进制和十进制都是相同的。如需进一步阅读see

答案 3 :(得分:1)

如果需要处理分数输入,如表示八进制数并且小数值为83.589843750的字符串“123.456”,则将整数(整数)部分和小数部分分别读为整数:八进制数字串中的每个整数。

重复使用代码的好时机,因此创建一个辅助函数。代码可以使用unsigned on; scanf("%o",&on);或代码,如下所示。

分数部分有点棘手。下面的代码将每个小数位“除以”乘以8乘以1000/8并除以1000(通过打印.右侧的3位数组。)

#include <stdio.h>
#include <limits.h>
#include <stdint.h>

static int ReadOctal(uintmax_t *octal, unsigned *count) {
  int ch;
  *octal = 0;
  *count = 0;
  while ((ch=fgetc(stdin)) >= '0' && ch <= '7') {
    (*count)++;
    if (*octal > UINTMAX_MAX/8) puts("Overflow");
    *octal = *octal*8 + (unsigned)(ch - '0');
  }
  return ch;
}

void octal_decimal(void) {
  uintmax_t ipart;
  uintmax_t fpart = 0;
  unsigned count;
  int ch = ReadOctal(&ipart, &count);
  if (ch == '.') {
    ReadOctal(&fpart, &count);
  }
  printf("%ju", ipart);
  if (ch == '.') {
    for (unsigned i=0; i<count; i++) {
      if (fpart > UINTMAX_MAX/(1000/8)) puts("Overflow");
      fpart *= 1000/8;
    }
    printf(".%0*ju", count*3, fpart);
  }
  puts("");
}

123.456 // input
83.589843750 // output