八进制到十进制和二进制输出错误
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", &n);
你可以使用scanf
,还是应该使用getchar()
一次读取一个字符?
@user3386109 关键字是否保持不变?我尝试在输入和输出上都使用%lo
,只有十进制输出是正确的,而不是二进制。
我们只需要使用scanf
【参考方案1】:
较小的数字可以正常工作,但它会在较高的输入下给出不同的输出。
溢出
输入 "575360400"
(以 8 为基数)转换为 27 位值。要使place = place * 10 ... bin = bin + (r * place);
工作,bin
需要是 90 位 unsigned long
。 unsigned long
肯定是 64 位或更少。
OP 需要一种新方法。
我会先用scanf("%lo", &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 <stdbool.h>
。备用:int bit = !!(mask & n);
.
我使用了#include<stdbool.h>
,它似乎已经识别出bool
。但是我对ULONG_MAX
和bit
等一些变量感到困惑
@PABLO1403 常量 ULONG_MAX
在<limits.h>
中定义,是unsigned long
类型对象的最大值。 bit
是一个二进制数字:可以有两个值之一的数据存储单元。以上是关于八进制到十进制和二进制输出错误的主要内容,如果未能解决你的问题,请参考以下文章