C语言 使用数组和堆栈的十进制到二进制转换

z9ju0rcb  于 2022-12-17  发布在  其他
关注(0)|答案(5)|浏览(182)

这是我写的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;
  }

有人能帮我找出逻辑上的漏洞吗?
谢谢

q7solyqu

q7solyqu1#

我的答案是你的程序太复杂了。

#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;
}
vlurs2pr

vlurs2pr2#

函数pow返回一个double,在小数点后可以有一个9999999...,当它被强制转换为int时,它被四舍五入到底数,你可以使用ceil()函数来解决这个问题,它返回大于或等于参数的最小整数值,如下所示。

bin = bin + ceil(s*pow(10,(flag-1-i)));
0tdrvxhp

0tdrvxhp3#

//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);
    }
  }
snvhrwxg

snvhrwxg4#

下面是上述程序的一个简单版本

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

3hvapo4f

3hvapo4f5#

所以我对几个数字做了计算,这似乎是正确的。我同意其他人的看法,这是不必要的复杂,但这并不是造成你的问题本身,它只是使他们更难找到。
因此,从逻辑的Angular 来看,这个程序的输出似乎是正确的。让我们看看其他潜在的问题:
1.你正在用一个初始化为-1的int来索引一个数组

  • 这是一个不好的实践,也是不必要的。C中的数组索引永远不能为负,所以编译器会假设这是一个无符号数,所以如果你有一个32位处理器,它会假设你试图得到数组[2^32 - 1],这不是你想要的。总是使用无符号值作为数组索引
  • 可能发生的事情,我不确定,是你的编译器在幕后做了一些事情,这会把你的程序搞砸,这真的很难说。但它可能试图在你做加法之前把你的负数转换成一个无符号的int。通过把你的top声明改为:

无符号整数top = 0;
并更改您访问顶部的位置:

stk[++top] = n;

stk[top++] = n;

你还必须改变

y = stk[top];
 top = top-1;

top = top-1;
 y = stk[top];

我建议从这里开始,我还建议去掉电源线,单独打印数组的每一部分,因为它将以相同的方式输出,而且你已经有了所有的信息。

PRINTF("%d%d%d",stk[2],stk[1],stk[0]);

相关问题