这是我写的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;
}
有人能帮我找出逻辑上的漏洞吗?
谢谢
5条答案
按热度按时间q7solyqu1#
我的答案是你的程序太复杂了。
vlurs2pr2#
函数pow返回一个double,在小数点后可以有一个9999999...,当它被强制转换为int时,它被四舍五入到底数,你可以使用ceil()函数来解决这个问题,它返回大于或等于参数的最小整数值,如下所示。
0tdrvxhp3#
snvhrwxg4#
下面是上述程序的一个简单版本
参考上述代码C program to Convert Decimal number into Binary using Stack
3hvapo4f5#
所以我对几个数字做了计算,这似乎是正确的。我同意其他人的看法,这是不必要的复杂,但这并不是造成你的问题本身,它只是使他们更难找到。
因此,从逻辑的Angular 来看,这个程序的输出似乎是正确的。让我们看看其他潜在的问题:
1.你正在用一个初始化为-1的int来索引一个数组
无符号整数top = 0;
并更改您访问顶部的位置:
到
你还必须改变
到
我建议从这里开始,我还建议去掉电源线,单独打印数组的每一部分,因为它将以相同的方式输出,而且你已经有了所有的信息。