程序以二进制格式打印从0到给定数字的所有十进制数

时间:2014-07-25 08:26:44

标签: c algorithm

我是C的新手。 我正在编写一个程序来打印从0到给定数字的所有十进制数字(由用户提供),但我的输出不是我所期望的。我不明白我写的程序中有什么错误....

#include <stdio.h>
int main()
{
    int x,n;
    printf("Enter any number\n");
    scanf("%d",&x);
    n=x;
    printf("numbers in binary format\n");
    while(n!=0)
    {
        int num[8]={0,0,0,0,0,0,0,0};
        int y[8]={0,0,0,0,0,0,0,0};
        int i=7;
        while(x!=0)
        {
            y[i]=x%2;
            x=x/2;
            i=i-1;
        }
        while(i!=8)
        {
            printf("%d",y[i]);
            i=i+1;
        }
        printf("\n");
        n=n-1;
    }
}

5 个答案:

答案 0 :(得分:1)

您只是忘了在while循环中设置x的值,这是代码:

#include <stdio.h>
int main()
{
    int x,n;
    printf("Enter any number\n");
    scanf("%d",&x);
    n=x;
    printf("numbers in binary format\n");
    while(n!=0)
    {
        x=n;
        int y[8]={0,0,0,0,0,0,0,0};
        int i=7;
        while(x!=0)
        {
            y[i]=x%2;
            x=x/2;
            i=i-1;
        }
        i=0;
        while(i!=8)
        {
            printf("%d",y[i]);
            i=i+1;
        }
        printf("\n");
        n=n-1;
    }
}

我必须补充说,变量num未被使用。

答案 1 :(得分:1)

问题在于你的第一个循环

    while(x!=0)
    {
        y[i]=x%2;
        x=x/2;
        i=i-1;
    }

当这个循环结束时,你的i在大多数情况下为0,你的第二个while循环基于这个假设。

刚刚放了一个

i = 0;
第一次循环后

。它应该工作。

答案 2 :(得分:0)

试试这个简单的方法 -

printf("numbers in binary format\n");
for(n=0;n<=x;n++)  // this loop will print the number 0 to x in binary format.
{
  for(i=31;i>=0;i--) // this is for 32 bit integer. if you are using 16 bit integer make i=15 in initialization.
  {
    if(n&(1<<i)) 
    printf("1");
    else
    printf("0");
  }
 printf("\n");
}

答案 3 :(得分:0)

值i在第一个循环中递减,并且在循环后不会重置为0。 请设置

循环后

i = 0,它应该可以工作。

答案 4 :(得分:0)

要从unsigned int(仅0或正数)转换为相应的字符串表示,您可以这样做:

char *bin(unsigned int number, char *result)
{
    unsigned int mask = 1 << ((sizeof(unsigned int) * 8) - 1);
    int i;

    for (i = 0; i < sizeof(unsigned int) * 8; i++)
    {
        if (number & mask)
        {
            result[i] = '1';

        }
        else
        {
            result[i] = '0';
        }

        number <<= 1;
    }

    result[i]='\0'; //Terminate the string

    return result;
}

在开始时,它创建mask作为一个全数为零的数字,除了最重要的位。

然后它使用要转换的数字的最高位执行该掩码的二进制结束,并将01放入字符串中。

然后它将数字转换为转换,以便最高位丢失,第二个最重要的位置现在是最重要的,并继续直到数字完全转换为字符串。

最后它终止了字符串。

您可以这样称呼它:

int main()
{
    int i, to;
    printf("Enter any number\n");
    scanf("%d", &to);
    char *result = calloc((sizeof(unsigned int) * 8) + 1, sizeof(char));

    for (i = 0; i <= to; i++)
    {
        printf("%s\n", bin(i, result));
    }

    free(result);

    return 0;
}