用c语言编写八进制转换二进制程序

如题所述

#include<stdio.h>
#include<stdlib.h>
int main()
{
int num;
char str[33];
printf("输入八进制数:");
scanf("%o",&num);
itoa(num, str, 2);
printf("八进制数%o转化为二进制是%s\n", num,str);
return 0;
}

已修改!

解题技巧: 用 itoa()和atoi() 两个库函数。

注:
1.itoa()函数有3个参数:第一个参数是要转换的数字,第二个参数是目标字符串,第三个参数是转移数字时所用的基数。在上例中,转换基数为2。2:十进制;10:十进制。

2.itoa(num, str, 2); 的作用是将num这个数以二进制形式的字符串形式存放在str指向的内存中。
如:itoa(10, str, 2);转化后str中字符串是“ 0001010”,10D=0001010B。
(后缀D、B分别代表十进制、二进制)

3.itoa(num, str, 10); 的作用是将num这个数以十进制形式的字符串形式存放在str指向的内存中。
如:itoa(10, str, 2);转化后str中字符串是“10”,10D = 10D。

4.使用itoa()函数时别忘记加头文件 #include<stdlib.h>
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-03-01
现在提供一个从2到16之间的互相转换程序,可以实现小数,整数,负数,正数等之间的互相转换,楼主可以根据自己的需要稍作修改即可满足你自己的需要,O(∩_∩)O~
源程序如下:
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
void main()
{
int i,j,k,m,n,x,b[20],h[20],c,t;
double d,r,p=0;
char a[20];
printf("请输入一个任意进制的数:");
gets(a);//在头文件<string.h>中定义
printf("请输入此数为何种进制的数:");
scanf("%d",&t);
printf("请输入要转换成的进制(1<N<=16):");
scanf("%d",&n);
m=strlen(a);//求字符串的长度
x=m;
for(k=0,j=0;k<m;k++)//主要是分段,以小数点为界限
{
if(a[k]=='.')
{
x=k;
break;
}
if(a[k]=='-')
j++;
}
for(k=x+1;k<m;k++)//修正输入过程中可能会输入不止一个“.”和“-”的问题
{
if(a[k]=='-')
j++;
if(j>1)//如果其中再次遇到“-”证明输入有误,终止程序
{
printf("ERROR!\n");
exit(0);
}
if(a[k]=='.')//如果其中再次遇到“.”证明输入有误,终止程序
{
printf("ERROR!\n");
exit(0);
}
}//注意:前面两个for()循环可以合并成一个循环,这样就可以节约很多的代码的,但是相对而言,两段程序的时间复杂度一样,修改后的代码如下:
/*
i=0;
j=0;
for(k=0;k<m;k++)
{
if(a[k]=='.')
{
i++;
x=k;
}
if(a[k]=='-')
j++;
if(i>1||j>1)
{
printf("ERROR!\n");
exit(0);
}
}*/
for(j=x-1;j>=0;j--)
{
if(a[j]=='-')//符号的处理
break;
if(a[j]=='A')
r=10;
else
if(a[j]=='B')
r=11;
else
if(a[j]=='C')
r=12;
else
if(a[j]=='D')
r=13;
else
if(a[j]=='E')
r=14;
else
if(a[j]=='F')
r=15;
else
if(a[j]<48||a[j]>57&&a[j]<65||a[j]>70)//修正程序输入合不合法问题的判断,此处采用ASCII值进行编辑
//if(a[j]>='G'&&a[j]<='Z'||a[j]>='a'&&a[j]<='z')//此段程序不能判断像输入&、%、#等字符的错误判断
{
printf("ERROR!\n");
exit(0);//在头文件<stdlib.h>中定义,无条件跳出程序的的运行
}
else
r=a[j]-'0';//将字符转换成数字
if(r>=t)
{
printf("ERROR!\n");
exit(0);
}
p=p+r*pow((double)t,(double)(x-j-1));//计算结果
}
if(a[x]=='.')
{
for(j=x+1;j<m;j++)
{
if(a[j]=='A')
r=10;
else
if(a[j]=='B')
r=11;
else
if(a[j]=='C')
r=12;
else
if(a[j]=='D')
r=13;
else
if(a[j]=='E')
r=14;
else
if(a[j]=='F')
r=15;
else
if(a[j]<48||a[j]>57&&a[j]<65||a[j]>70)//修正程序输入合不合法问题的判断,此处采用ASCII值进行编辑
//if(a[j]>='G'&&a[j]<='Z'||a[j]>='a'&&a[j]<='z')//此段程序不能判断像输入&、%、#等字符的错误判断
{
printf("ERROR!\n");
exit(0);
}
else
r=a[j]-'0';//将字符转换成数字
if(r>=t)
{
printf("ERROR!\n");
exit(0);
}
p=p+r*pow((double)t,(double)(x-j));
}
}
if(n==10)//选择性计算,如果是整数就不用进行这一步的计算了,这样可以节约程序的运行时间
{
printf("转换结果为:");
if(a[0]=='-')
{
printf("-");
}
printf("%f",p);
}
else
{
k=p;//强制类型转换,可以使用k=(int)p;代替,从而更加的一目了然
i=0;
while(k)//判定需要转换的数是否变为0
{
h[i++]=k%n;//取余,进行进制转换,但是顺序与正确值相反
k/=n;//转换一位之后进行相应的变化
}
c=0;
//if(p!=(int)p)//选择性计算,如果是整数就不用进行这一步的计算了,这样可以节约程序的运行时间
//{
d=p-(int)p;//取小数部分
while(d!=0)
{
b[c]=(int)(d*n);//算法为×N取整
d=d*n-b[c];
c++;
if(c>=10)
break;//主要是控制小数后面万一出现无限小数的时候好跳出循环以免出现死循环
//}
}
printf("转换结果为:");
if(a[0]=='-')
printf("-");
for(j=i-1;j>=0;j--)//反序输出,大于10的数字进行相应的变化
{
if(h[j]==10)
printf("A");
else
if(h[j]==11)
printf("B");
else
if(h[j]==12)
printf("C");
else
if(h[j]==13)
printf("D");
else
if(h[j]==14)
printf("E");
else
if(h[j]==15)
printf("F");
else
printf("%d",h[j]);
}
if(p!=(int)p)//选择性输出,这样可以节约输出时间和程序的运行时间
{
printf(".");
for(j=0;j<c;j++)//正序输出
{
if(b[j]==10)
printf("A");
else
if(b[j]==11)
printf("B");
else
if(b[j]==12)
printf("C");
else
if(b[j]==13)
printf("D");
else
if(b[j]==14)
printf("E");
else
if(b[j]==15)
printf("F");
else
printf("%d",b[j]);
}
}
if(c>=10)//如果是无限小数则在后以省略号表示
printf("......");
}
printf("\n");//输出换行,以使程序的输出结果美观
}