c语言:写一个程序完成二进制与十进制,十进制与十六进制之间的转换。

如题所述

计算机中常用的数的进制主要有:二进制、八进制、十六进制,学习计算机要对其有所了解。2进制,用两个阿拉伯数字:0、1;8进制,用八个阿拉伯数字:0、1、2、3、4、5、6、7;10进制,用十个阿拉伯数字:0到9;16进制就是逢16进1,但我们只有0~9这十个数字,所以我们用A,B,C,D,E,F这五个字母来分别表示10,11,12,13,14,15。字母不区分大小写。以下简介各种进制之间的转换方法:一、二进制转换十进制例:二进制“1101100”1101100←二进制数6543210←排位方法例如二进制换算十进制的算法:1*26+1*25+0*24+1*23+1*22+0*21+0*20↑↑说明:2代表进制,后面的数是次方(从右往左数,以0开始)=64+32+0+8+4+0+0=108二、二进制换算八进制例:二进制的“10110111011”换八进制时,从右到左,三位一组,不够补0,即成了:010110111011然后每组中的3个数分别对应4、2、1的状态,然后将为状态为1的相加,如:010=2110=4+2=6111=4+2+1=7011=2+1=3结果为:2673三、二进制转换十六进制十六进制换二进制的方法也类似,只要每组4位,分别对应8、4、2、1就行了,如分解为:010110111011运算为:0101=4+1=51011=8+2+1=11(由于10为A,所以11即B)1011=8+2+1=11(由于10为A,所以11即B)结果为:5BB四、二进制数转换为十进制数二进制数第0位的权值是2的0次方,第1位的权值是2的1次方……所以,设有一个二进制数:01100100,转换为10进制为:计算:0*20+0*21+1*22+0*23+0*24+1*25+1*26+0*27=100五、八进制数转换为十进制数八进制就是逢8进1。八进制数采用0~7这八数来表达一个数。八进制数第0位的权值为8的0次方,第1位权值为8的1次方,第2位权值为8的2次方……所以,设有一个八进制数:1507,转换为十进制为:计算:7*80+0*81+5*82+1*83=839结果是,八进制数1507转换成十进制数为839六、十六进制转换十进制例:2AF5换算成10进制直接计算就是:5*160+F*161+A*162+2*163=10997(别忘了,在上面的计算中,A表示10,而F表示15)、现在可以看出,所有进制换算成10进制,关键在于各自的权值不同。假设有人问你,十进数1234为什么是一千二百三十四?你尽可以给他这么一个算式:1234=1*103+2*102+3*101+4*100十进制与二进制转换之相互算法十进制转二进制:用2辗转相除至结果为1将余数和最后的1从下向上倒序写就是结果例如302302/2=151余0151/2=75余175/2=37余137/2=18余118/2=9余09/2=4余14/2=2余02/2=1余0故二进制为100101110二进制转十进制从最后一位开始算,依次列为第0、1、2位第n位的数(0或1)乘以2的n次方得到的结果相加就是答案例如:01101011.转十进制:第0位:1乘2的0次方=11乘2的1次方=20乘2的2次方=01乘2的3次方=80乘2的4次方=01乘2的5次方=321乘2的6次方=640乘2的7次方=0然后:1+2+0+8+0+32+64+0=107.二进制01101011=十进制107.一、二进制数转换成十进制数由二进制数转换成十进制数的基本做法是,把二进制数首先写成加权系数式,然后按十进制加法规则求和。这种做法称为"按权相加"法。二、十进制数转换为二进制数十进制数转换为二进制数时,由于整数和小数的转换方法不同,所以先将十进制数的整数部分和小数部分分别转换后,再加以合并。1.十进制整数转换为二进制整数十进制整数转换为二进制整数采用"除2取余,逆序排列"法。具体做法是:用2去除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为零时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。2.十进制小数转换为二进制小数十进制小数转换成二进制小数采用"乘2取整,顺序排列"法。具体做法是:用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的小数部分为零,或者达到所要求的精度为止。然后把取出的整数部分按顺序排列起来,先取的整数作为二进制小数的高位有效位,后取的整数作为低位有效位。1.二进制与十进制的转换(1)二进制转十进制方法:"按权求和"例:(1011.01)2=(1×23+0×22+1×21+1×20+0×2-1+1×2-2)10=(8+0+2+1+0+0.25)10=(11.25)10(2)十进制转二进制·十进制整数转二进制数:"除以2取余,逆序输出"例:(89)10=(1011001)2289244……1222……0211……025……122……121……00……1·十进制小数转二进制数:"乘以2取整,顺序输出"例:(0.625)10=(0.101)20.625X21.25X20.5X21.02.八进制与二进制的转换例:将八进制的37.416转换成二进制数:37.416011111.100001110即:(37.416)8=(11111.10000111)2例:将二进制的10110.0011转换成八进制:010110.00110026.14即:(10110.011)2=(26.14)83.十六进制与二进制的转换例:将十六进制数5DF.9转换成二进制:5DF.9010111011111.1001即:(5DF.9)16=(10111011111.1001)2例:将二进制数1100001.111转换成十六进制:01100001.111061.E即:(1100001.111)2=(61.E)16
温馨提示:答案为网友推荐,仅供参考
第1个回答  2016-05-17

    当时刚学的时候写的个程序= =以前写的,现在看太冗长了些,不过至少是对的╮(╯_╰)╭

    这个是C++,你要C语言的话把里面的cin改成scanf,把cout改成printf,头文件的<iostream>改成<stdio.h>就好

#include<iostream>
#include<math.h>
using namespace std;

int TentoTwo(int n)
{
int b[10000],a[10000],i,j;

for(i=0;n>=2;i++)
{
a[i]=n%2;
n=n/2;
}
a[i]=n;
cout<<"转换为二进制:";
for(j=0;i>=0;i--,j++)
{
b[j]=a[i];
cout<<b[j];
}
return 0;
}

int TentoSixteen(int n)
{
int i,j;
char b[10000],a[10000];

for(i=0;n>=16;i++)
{
a[i]=n%16;
n=n/16;
switch(a[i])
{
case 1:a[i]='1';break;
case 2:a[i]='2';break;
case 3:a[i]='3';break;
case 4:a[i]='4';break;
case 5:a[i]='5';break;
case 6:a[i]='6';break;
case 7:a[i]='7';break;
case 8:a[i]='8';break;
case 9:a[i]='9';break;
case 10:a[i]='A';break;
case 11:a[i]='B';break;
case 12:a[i]='C';break;
case 13:a[i]='D';break;
case 14:a[i]='E';break;
case 15:a[i]='F';break;
}
}
a[i]=n;
switch(a[i])
    {
        case 1:a[i]='1';break;
        case 2:a[i]='2';break;
        case 3:a[i]='3';break;
        case 4:a[i]='4';break;
        case 5:a[i]='5';break;
        case 6:a[i]='6';break;
        case 7:a[i]='7';break;
        case 8:a[i]='8';break;
        case 9:a[i]='9';break;
        case 10:a[i]='A';break;
        case 11:a[i]='B';break;
        case 12:a[i]='C';break;
        case 13:a[i]='D';break;
        case 14:a[i]='E';break;
        case 15:a[i]='F';break;
    }
cout<<"转换为十六进制:";
for(j=0;i>=0;i--,j++)
{
b[j]=a[i];
cout<<b[j];
}
return 0;
}

int TwotoTen(int n)
{
    int i,ans=0,a;
    for(i=0;n>0;i++)
    {
        a=n%10;
        n=n/10;
        ans=ans+a*pow(2,i);
    }
    cout<<"转换成十进制:"<<ans;
    return 0;
}

int SixteentoTen(int n)
{
    int i,t;
    int ans=0;
    char a[10000];
    cout<<"请输入一个数:";
    cin>>a;
    for(i=0;a[i];i++)
    {
        if(a[i]<='9')
            t=a[i]-'0';
        else
            t=a[i]-'A'+10;
        ans=ans*16+t;
    }
    cout<<"转换成十进制:"<<ans;
    return 0;
}

int main()
{
int n,k=1,m;
while(k!=0)
{
        cout<<"0、退出 1、十进制转二进制 2、十进制转十六进制 3、二进制转十进制 4、十六进制转十进制"<<endl;
        cout<<"请选择功能:";
        cin>>n;
        if(n==0)
            break;
        else if(n==4)
        {
            SixteentoTen(m);
            cout<<endl<<endl;
        }
        else
        {
            cout<<"请输入一个数:";
            cin>>m;
            switch(n)
            {
                case 1:TentoTwo(m);cout<<endl<<endl;break;
                case 2:TentoSixteen(m);cout<<endl<<endl;break;
                case 3:TwotoTen(m);cout<<endl<<endl;break;
            }
        }
}
return 0;
}

本回答被提问者和网友采纳
相似回答