关于十进制数转变为二进制数的有关问题
关于十进制数转变为二进制数的问题
最近写了个十进制数转化为二进制数的程序,由于我是初学者花了一上午一下午的时间,总算写出来了。
基本上算是完成了,美中不足的是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");
}
------解决方案--------------------
最近写了个十进制数转化为二进制数的程序,由于我是初学者花了一上午一下午的时间,总算写出来了。
基本上算是完成了,美中不足的是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