这是我编写的用于将十进制数转换为等效二进制数的C程序。我使用了Stack(使用数组实现)和以下算法:
数字被分割,剩余部分被推入堆栈。 每次弹出一个余数并转换为二进制
问题是该程序适用于最多3个数字,之后从4个病房开始,每个二进制数比实际数字少一个。
// Decimal to Binary conversion using Stack
#include<stdio.h>
#include<math.h>
#define max 20
int top=-1, stk[max];
void push(int);
int pop(void);
int main()
{
int i,num,x,flag=0,s, bin=0, factor;
printf("Enter any decimal number: ");
scanf("%d",&num);
while(num>0)
{
if(num==1)
push(num);
else
{
x = num%2;
push(x);
}
num/=2;
flag++;
}
for(i=0;i<flag;i++)
{
s = pop();
bin = bin + s*pow(10,(flag-1-i));
}
printf("\nEquivalent Binary number is --> %d",bin);
return 0;
}
void push(int n)
{
if(top == max-1)
{
printf("Error! Overflow");
return;
}
stk[++top] = n;
}
int pop(void)
{
int y;
if(top == -1)
{
printf("Error! Underflow");
return;
}
y = stk[top];
top = top-1;
return y;
}
有人会通过找到合乎逻辑的缺陷来帮助我吗?
谢谢
答案 0 :(得分:0)
函数pow返回一个double,可以有一个9999999 ...小数点后面,当它被转换为int时四舍五入到地板,你可以使用ceil()函数修复你的问题,返回最小的大于或等于参数的整数值,如下所示。
bin = bin + ceil(s*pow(10,(flag-1-i)));
答案 1 :(得分:0)
我的回答是你的程序不必要地复杂。
#include<stdio.h>
int main()
{
unsigned num, i, zeros = 0;
printf("Enter a decimal number: ");
scanf("%u", &num);
printf ("Decimal %u in binary is ", num);
for (i=sizeof(unsigned)*8; i>0; i--)
{
if ((int)num < 0) // get MSB
zeros = printf ("1"); // cancel 0-suppresion
else if (zeros)
printf ("0");
num <<= 1;
}
printf ("\n");
return 0;
}
答案 2 :(得分:0)
//C Program to convert Decimal to binary using Stack
#include<stdio.h>
#define max 100
int stack[max],top=-1,i,x;
/*------ Function Prototype------------*/
void push (int x)
{
++top;
stack [top] = x;
}
int pop ()
{
return stack[top];
}
/*-------------------------------------*/
void main()
{
int num, total = 0,item;
printf( "Please enter a decimal: ");
scanf("%d",&num);
while(num > 0)
{
total = num % 2;
push(total);
num /= 2;
}
for(i=top;top>-1;top--)
{
item = pop ();
printf("%d",item);
}
}
答案 3 :(得分:0)
以上是上述程序的简单版本
int main(){
int n,remainder;
printf("Enter a decimal number:");
scanf("%d",&n);
while(n!=0){
remainder = n%2;
n = n/2;
push(remainder); // inserting in stack
}
display(); // displaying the stack elements
}
上述代码的参考 C program to Convert Decimal number into Binary using Stack
答案 4 :(得分:0)
所以我已经对几个数字进行了数学计算,这似乎是正确的。我同意其他人的看法,即这不必要地复杂化,但这并不会单独导致您的问题,只会让它们更难找到。
所以从逻辑的角度来看,这个程序的输出看起来是正确的。让我们看看其他潜在问题:
这是不好的做法,而且没有必要。 C 中的数组索引永远不能为负,因此编译器会假定这是一个无符号数,因此如果您有一个 32 位处理器,它会假定您正在尝试获取数组 [2^32 - 1],这不是你想要什么。数组索引始终使用无符号值
可能会发生什么,我不确定,是你的编译器在幕后做了一些事情,搞砸了你的程序,这真的很难说。但它可能试图在您进行加法之前将您的负数转换为 unsigned int。通过将 top 的声明更改为:
来解决此问题unsigned int top = 0;
并更改您访问 top 的位置:
stk[++top] = n;
到
stk[top++] = n;
你也必须改变
y = stk[top];
top = top-1;
到
top = top-1;
y = stk[top];
我想说从那里开始。我还建议删除 pow 行,并单独打印数组的每一部分,因为它会以相同的方式输出,并且您已经拥有所有信息,即。
PRINTF("%d%d%d",stk[2],stk[1],stk[0]);