C语言中如何用算法实现进制间的转化?

2024-11-30 07:47:35
推荐回答(2个)
回答1:

C语言中实现10进制转换为任意进制的过程为:

  • 定义数组int rs[32],保存转换后的数据,整数的转换结果最多32位(4字节*8位)

  • 定义一个数组char map[]={'0','1','2','3',...,'9','A','B',...'F'},完成相应数值对应的转换后的字符

  • 输入10进制数(整数)num

  • 转入转换进制基数(2-16)ind

  • 循环对num进行模ind运算,得到余数存储到数组rs中

  •     num缩小ind倍

  •     当num为0时结束循环

  • 反向输出数组rs中对应的各元素对应的map字符,得到转换结果

参考代码:

#include 
int main()
{
    char map[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    int i,c[32],num,ind;
    do {printf("input num: ");scanf("%d", &num );}while(num<0 );
    do {printf("input ind: ");scanf("%d", &ind );} while( ind>16||ind<2);
    i=0;
    do {
        c[i++]=num%ind;
        num/=ind;
    } while(num!=0) ;
    for(i--;i>=0;i--)
        printf("%c",map[c[i]] );
    printf("\n");
    return 0;
}

运行结果:

input num: 100

input ind: 2

1100100


input num: 100

input ind: 8

144


input num: 100

input ind: 16

64

回答2:

说明:如18的二进制代码为:10010(用除2法算得). 18/2=9 余 0 9/2=4 余 1 4/2=2 余 0 2/2=1 余 0 1/2=0 余 1 (当除得的结果为0时,只需将所有的余数从上往上连在一起,就组成了18的二进制代码:10010) 如果要转换为8进制数,即用3个二进制位就可以表示一个8进制数,为了方便计算,我们在某些位上进行截止计算,如18我们就截取表示成10,010(“,”前的用逐位乘2法算得,当遇上“,”时乘10再用乘2法算得。),所以18的8进制表示为(1*2+0)*10+(0*2+1)*2+0=22(0)。对于16进制只要4个二进制就能表示一位16进制数,如18的截取表示为1,0010,16进制表示为 1*10+((0*2+0)*2+1)*2+0=12(h)。 #include "stdio.h" void main(){ int num,rlt,temp; int j,i,k; int ch1[30]; scanf("输入一个十进制数:%d",num);//输入一个十进制数num i=num; for(j=0;i>0;j++){//输出二进制数组 ch1[j]=i%2; i=i/2; } for(i=0,2*i0){ temp=temp*2+ch1[i];break; } if(i==j%k||(i-j%k)%k==0){//进行分位点的计算 temp=temp*2+ch1[i];rlt=rlt*10+temp;temp=0;break; } } if (k==3) i=8; else if(k==4) i=16; else i=2; printf("%d的%d进制代码为:%d",num,i,rlt); }