关于十进制数转变为二进制数的有关问题

关于十进制数转变为二进制数的问题
最近写了个十进制数转化为二进制数的程序,由于我是初学者花了一上午一下午的时间,总算写出来了。
基本上算是完成了,美中不足的是0和1不能用二进制表达。
  自己也觉得我的算法很麻烦。希望大家能帮我改改,有什么更好的算法,欢迎指教。


#include <stdio.h>

int isodd(int j); //判断是否为奇数
int fun1(int a[],int c,int k); //函数一:按二进制数位从高到低求出对应的数是1的数位
int fun2(int l,int n); //函数二:将十进制数减去二进制中数位为1所对应的十进制数
void display(int a[],int c,int o); //将结果展示出来

void main()
{
int a[8]={0,0,0,0,0,0,0,0}; //将数组初始化为全部是零的二进制数即00000000
int x=0;
int y=0;
int z=0;
int o=0; //存储二进制数中为1的对应的最大位数
int trial=0; //用于存储if块中的x值  
printf("Input a number between 1 and 100:\n");
scanf("%d",&x);

if(isodd(x))
{
x--; //若为奇数则减一
trial=x;
while(trial)
{
trial/=2;
o++;
} //得出二进制中为1的对应的最大位数
y=x; //将x赋予y
do{
z=fun1(a,8,y);
y=(fun2(z,y));
}while((z>=1)&&(y!=0)); //防止出现2的幂时,陷入死循环
a[0]=1;
}
else
{
trial=x;
while(trial)
{
trial/=2;
o++;
} //得出二进制中为1的对应的最大位数
y=x; //将x赋予y
do{
z=fun1(a,8,y);
y=(fun2(z,y));
}while((z>=1)&&(y!=0)); //防止出现2的幂时,陷入死循环
}
display(a,8,o);
}

int isodd(int j)
{
if(j%2==0)
return 0; //偶数则返回0
else
return 1; //奇数则返回1
}

int fun1(int a[],int c,int k)
{
int i=-1; //loop counter
do
{
k=k/2;
i++;  
}while(k);
a[i]=1;
return (i+1); //返回每次循环二进制数是1对应的位数
}

int fun2(int l,int n)
{
int m=1;
for(;l>1;l--) //直到二进制位数为1
m*=2;
n-=m; //十进制数减去其二进制最大数位对应的十进制数
return n;
}

void display(int a[],int c,int o)
{
for(;o>=1;o--)
printf("%d",a[o-1]); //打印出十进制数对应的二进制数
printf("\n");
}


------解决方案--------------------
C/C++ code

#include <stdio.h>
#include <string.h>

int main()
{
    char str[256];
    puts("Input number:");
    gets(str);       //获取字符串
    int len = strlen(str);    //长度
    for ( int i=0; i<len; ++i )
    {
        char tmp;
        tmp = str[i] - '0';    
        printf("%d", (tmp&8)==0?0:1); //显示各个bit上的数值
        printf("%d", (tmp&4)==0?0:1);
        printf("%d", (tmp&2)==0?0:1);
        printf("%d", (tmp&1)==0?0:1);
    }
    
    return 0;
}

------解决方案--------------------
C/C++ code
#include <stdlib.h>
  #include <stdio.h>
  void main( void )
  {
  char buffer[20];
  int i = 3445;
  long l = -344115L;
  unsigned long ul = 1234567890UL;
  _itoa( i, buffer, 10 );
  printf( "String of integer %d (radix 10): %s\n", i, buffer );
  _itoa( i, buffer, 16 );
  printf( "String of integer %d (radix 16): 0x%s\n", i, buffer );
  _itoa( i, buffer, 2 );
  printf( "String of integer %d (radix 2): %s\n", i, buffer );
  _ltoa( l, buffer, 16 );
  printf( "String of long int %ld (radix 16): 0x%s\n", l, buffer );
  _ultoa( ul, buffer, 16 );
  printf( "String of unsigned long %lu (radix 16): 0x%s\n", ul, buffer );
  }
  Output
  String of integer 3445 (radix 10): 3445
  String of integer 3445 (radix 16): 0xd75
  String of integer 3445 (radix 2): 110101110101
  String of long int -344115 (radix 16): 0xfffabfcd
  String of unsigned long 1234567890 (radix 16): 0x499602d2