使用Array和Stack进行十进制到二进制转换

时间:2014-11-29 19:02:30

标签: c arrays stack

这是我编写的用于将十进制数转换为等效二进制数的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 个答案:

答案 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)

所以我已经对几个数字进行了数学计算,这似乎是正确的。我同意其他人的看法,即这不必要地复杂化,但这并不会单独导致您的问题,只会让它们更难找到。

所以从逻辑的角度来看,这个程序的输出看起来是正确的。让我们看看其他潜在问题:

  1. 您正在使用初始化为 -1 的 int 索引数组
  • 这是不好的做法,而且没有必要。 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]);