【问题标题】:Converting Octal numbers To Decimal in C在C中将八进制数转换为十进制
【发布时间】:2015-09-22 14:26:36
【问题描述】:
#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.758 → ___10

0.000018 → ___10

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

我需要这方面的帮助。

【问题讨论】:

  • 首先,请缩进你的代码
  • 你把事情搞混了。八进制、十六进制等等,都是字符串内的整数的可能表示形式。一旦一个数字被这样存储,它就是二进制的,你不会看到字符串内部的外部编码有什么不同。

标签: c octal


【解决方案1】:

别这样。

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

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

【讨论】:

  • 然后,使用printf("%o", n); 显示八进制。
  • 我不赞成这个答案,因为它没有解决任意精度的复平面上的无理数。
  • 哈哈!我完全尊重你的决定。该死的,现在我不再有足够的声誉来评论你的答案——我刚刚投了赞成票。
  • char* 缓冲区。 -> 字符数组。
【解决方案2】:

这是一个程序,它将输入一个小数八进制数并将其转换为浮点值。 需要一个八进制点和至少一个后续数字,因此不要指望这适用于“100”或“100”之类的输入。

#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

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

【讨论】:

  • 这是正确的答案。其他的不处理小数。
  • 不,它不是:它不处理任意精度的复平面上的无理数。 OP 显然想要整数,否则他们会选择不同的数据类型。这是一个你在哪里画线来回答的问题。或许更合适。但这并不完全正确。
  • 格式说明符 %n 需要 int *len1len2 应定义为 int
  • (1&lt;&lt;(len2-len1)*3) 可能很容易溢出。你至少应该写(1ULL &lt;&lt; ((len2 - len1) * 3))。更安全的方法是使用ldexpfrexp
【解决方案3】:

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

#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

【讨论】:

  • 您应该使用%u 表示十进制的unsigned on
【解决方案4】:

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

代码重用的好时机,所以创建一个辅助函数。代码可以使用unsigned on; scanf("%o",&amp;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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 2011-08-21
    • 2017-03-05
    • 2018-01-26
    • 2011-10-02
    • 1970-01-01
    相关资源
    最近更新 更多