Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用数组和堆栈进行十进制到二进制的转换_C_Arrays_Stack - Fatal编程技术网

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

C 使用数组和堆栈进行十进制到二进制的转换,c,arrays,stack,C,Arrays,Stack,这是我写的C程序,用来将十进制数转换成等价的二进制数。我使用了堆栈(使用数组实现)和以下算法: 数字被分割,剩余部分被推入堆栈。 余数一次弹出一个并转换为二进制 问题是,该程序可以很好地处理3以下的数字,从4开始,每个二进制数都比实际数少一个 // Decimal to Binary conversion using Stack #include<stdio.h> #include<math.h> #define max 20 int top=-1, stk[max

这是我写的C程序,用来将十进制数转换成等价的二进制数。我使用了堆栈(使用数组实现)和以下算法:

数字被分割,剩余部分被推入堆栈。 余数一次弹出一个并转换为二进制

问题是,该程序可以很好地处理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;
  }
//使用堆栈将十进制转换为二进制
#包括
#包括
#定义最大值20
int-top=-1,stk[max];
无效推力(int);
int pop(无效);
int main()
{
int i,num,x,flag=0,s,bin=0,factor;
printf(“输入任何十进制数字:”);
scanf(“%d”和&num);
while(num>0)
{
如果(num==1)
推送(num);
其他的
{
x=num%2;
推(x);
}
num/=2;
flag++;
}

对于(i=0;i函数pow返回一个双精度,小数点后可以有一个9999999…当它被转换为int时,四舍五入到底部,您可以使用ceil()函数修复问题,该函数返回大于或等于参数的最小整数值,如下所示

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

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

#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;
}
#包括
int main()
{
无符号num,i,零=0;
printf(“输入十进制数字:”);
scanf(“%u”、&num);
printf(“二进制中的十进制%u为”,num);
对于(i=sizeof(无符号)*8;i>0;i--)
{
if((int)num<0)//获取MSB
zeros=printf(“1”);//取消0-suppresion
else if(零)
printf(“0”);
num
//使用堆栈将十进制转换为二进制的C程序
#包括
#定义最大值100
int stack[max],top=-1,i,x;
/*------功能原型------------*/
无效推送(整数x)
{
++顶部;
堆栈[顶部]=x;
}
int-pop()
{
返回堆栈[顶部];
}
/*-------------------------------------*/
void main()
{
int num,总计=0,项目;
printf(“请输入小数:”);
scanf(“%d”和&num);
while(num>0)
{
总数=num%2;
推送(总);
num/=2;
}
对于(i=top;top>-1;top--)
{
item=pop();
printf(“%d”,项目);
}
}

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

    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
}
上述代码的参考

什么意思是“比实际数字少1”?少1?少1位?此外,循环中的
if/else
是完全冗余的。可能溢出
bin
。请尝试
long-long-bin=0
printf(…%lld),bin)
我试过你的程序,它在3以上运行,例如
257
-->
100000001
。所以唯一的缺陷(除了不必要的复杂性)可能是你对二进制数的理解。在你发表评论后,我又试了一次,结果还是一样。例如,如果我把十进制数输入为4,它会给我99作为答案。如果我给257,它会给我100000000…!!这如何帮助OP找到代码中的逻辑缺陷?什么逻辑缺陷?如果你能找到,请自己发布。我的答案是,该缺陷是一个过于复杂的解决方案,正如我在上面所评论的那样,其“错误”答案甚至不存在。您的答案根本没有解决其他人的问题。它只是说“您的程序不必要地复杂”。以下是我的做法。这是一个非答案。
    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
}