八进制到十进制和二进制输出错误

Posted

技术标签:

【中文标题】八进制到十进制和二进制输出错误【英文标题】:Octal to decimal and binary with wrong outputs 【发布时间】:2022-01-16 02:13:07 【问题描述】:

我们被分配了一项任务,将八进制数转换为二进制和十进制。较小的数字工作得很好,但它会在较高的输入下给出不同的输出。代码如下:

#include <stdio.h>

void main() 
  unsigned long n, g, ans = 1, r = 0, dec = 0, place = 1, bin = 0;
  printf("Conversion: Octal to decimal and binary.\n");
  printf("Enter number: ");
  scanf("%lu", &n);
  printf("%lu is ", n);

  for (g = n; g != 0; ans = ans * 8) 
    r = g % 10;
    dec = dec + r * ans;
    g = g / 10;
  

  printf("%lu in Decimal Form. \n", dec);

  printf("%lu is ", n);
  for (; dec != 0; place = place * 10) 
    r = dec % 2;
    bin = bin + (r * place);
    dec = dec / 2;
  
  printf("%lu in Binary Form.\n", bin);

我们只需要使用有限的数据类型和控制结构。没有数组、字符串、函数等。

我们老师的测试用例中的输入是575360400,它必须以二进制输出101111101011110000100000000,以十进制输出100000000。但是二进制的输出是14184298036271661312。我已经使用了unsigned long,但它不起作用。

我不知道在给定的限制下这是怎么可能的,你的 cmets 和答案会很有帮助。

【问题讨论】:

代码将输入读取为十进制。要将输入读取为八进制,请使用 scanf("%lo", &amp;n); 你可以使用scanf,还是应该使用getchar()一次读取一个字符? @user3386109 关键字是否保持不变?我尝试在输入和输出上都使用%lo,只有十进制输出是正确的,而不是二进制。 我们只需要使用scanf 【参考方案1】:

较小的数字可以正常工作,但它会在较高的输入下给出不同的输出。

溢出

输入 "575360400"(以 8 为基数)转换为 27 位值。要使place = place * 10 ... bin = bin + (r * place); 工作,bin 需要是 90 位 unsigned longunsigned long 肯定是 64 位或更少。

OP 需要一种新方法。


我会先用scanf("%lo", &amp;n); 读取八进制 输入,然后用printf("%lu\n", n); 打印十进制

要以二进制形式打印,不包含数组、函数等,请考虑一个掩码,首先是最高有效位,每次迭代都向右移动。

  bool significant_digit = false;

  // Form 0b1000...0000
  //                   0b1111... - 0b01111..
  unsigned long mask = ULONG_MAX - ULONG_MAX/2;

  while (mask) 
    bool bit = mask & n;
    if (bit || significant_digit || mask == 1) 
      significant_digit = true;
      printf("%d", bit);
    
    mask >>= 1;
  
  printf("\n", bit);

Better approaches 存在。然而,由于 OP 的人为限制:“没有数组、字符串、函数等。”,我选择了一些说明性和简单的东西。


或等到 2023 年

C2x 预计将支持printf("%lb\n", n);。只需向教授请求延期?。

【讨论】:

bool 在我的编译器上不起作用哦,天哪,让我试试其他的 @PABLO1403 "bool 在我的编译器上不起作用" --> 你使用的是什么 C 编译器和版本?请务必添加#include &lt;stdbool.h&gt;。备用:int bit = !!(mask &amp; n);. 我使用了#include&lt;stdbool.h&gt;,它似乎已经识别出bool。但是我对ULONG_MAXbit等一些变量感到困惑 @PABLO1403 常量 ULONG_MAX&lt;limits.h&gt; 中定义,是unsigned long 类型对象的最大值。 bit 是一个二进制数字:可以有两个值之一的数据存储单元。

以上是关于八进制到十进制和二进制输出错误的主要内容,如果未能解决你的问题,请参考以下文章

C编译二进制文件的Nodejs exec在标准输出上显示标准错误?

c程序生成从1到n的二进制数

函数+进制转换器

C# ASP.NET怎么把二进制数据输出到文件?

将十进制转换为二进制结果[关闭]

Python Sklearn“ValueError:分类指标无法处理多类多输出和二进制目标的混合”错误