程序设计:数制转化问题(大数转换)

  • 常用进制:二进制、十进制、八进制、十六进制

    数学计算

  • 普通方法:用给定的数除以进制基数,得到的余数记录,得到的商继续重复上述操作,直到商为0,所有得到的余数反向记录,就可以转化为需要的进制数。

(1)给定的数/进制基数——>余数+商

(2)商/进制基数——>余数+商(新得到的商作为给定数重复(1)过程)

(3)直到商为0

  • 特殊方法:对除法进行每一位运算,模拟上述过程;

(1)如何模拟给定数/进制基数得到商和余数的过程:
        举例:给定数为237,进制基数为2

第一个数字2::2/2=1  2%2=0

第二个数字3: 先用上一步的余数0乘10加上3得到新的被除数:0*10+3=3

                        3/2=1   3%2=1

第三个数字6: 先用上一步的余数1乘10加上3得到新的被除数:1*10+7=17

                        17/2=8 17%2=1

直到所有的数字被处理完,最后一步得到的余数就是最后的余数,每一步得到的除数(按得到先后排列)就是商;

                如上237/2=118 237%2=1

   (2)   如何模拟商/进制基数得到商和余数的过程:用(1)得到商作为给定数重复(1)过程,直到商为0;

        举例:接上例,将给定数转化为二进制数

118重复(1)得到新的商:59,余数:0

59重复(1)得到新的商:29,余数:1

29重复(1)得到新的商:14,余数:1

14重复(1)得到新的商:7,余数:0

7重复(1)得到新的商:3,余数:1

3重复(1)得到新的商:1,余数:1

1重复(1)得到新的商:0,余数:1

最后得到的二进制表达为11101101

  用C语言实现进制转换:(以十进制转化为其他进制为例)

  1. 十进制数位数少,可以直接表示(反复取余得商,等同于常规计算方法)
  2. 十进制数位数大 ,用字符串表示,需要对每一位进行计算,利用特殊计算方法;代码如下:
    #include <stdio.h>
    #include <string.h>
    int BASE; //进制基数
    int DLEN; //十进制数长度
    int transform(int code[], int a[], int k)
    {     
       int i;
       for (i = 0; i < DLEN; i++)
       { //寻找到a[]中最高的非0位,为处理的起点
           if (a[i] != 0)
           {
              break;
           }
       }
       if(i==DLEN) return k;//完成进制转换的标志,在for循环结束后,i==DLEN,证明所有字符串均为0,证明已完成转化
       
    int mod = 0;//保存余数
    int temp;//保存余数和下一位运算后的数
        while(i<DLEN)
        {
            temp=mod*10+a[i];//余数和下一位数进行特定运算
            a[i]=temp/BASE;//更新a[],保存新的商,以备下次计算
            mod=temp%BASE;//保存余数
            i++;
        }
       code[k] = mod;//最终得到的余数保存到code[]中
       return transform(code, a, k + 1); //递归处理所有商
    }
      
    
    
    
    int main()
    {
       char str[321] = {0};//存储十进制数
       int nCode[1101] = {0}, nStr[321] = {0};//转化后的数的字符表示数组和数字表示
     
       gets(str);//输入十进制数
       DLEN = strlen(str);//十进制数长度
     
       scanf("%d", &BASE);//读入基数
    
       for (int i = 0; i < DLEN; i++)
       {
           nStr[i] = str[i] - '0';//符号转为数字
       }
     
       int codeLen = transform(nCode, nStr, 0);//转化后的长度
    
       for (int i = codeLen - 1; i >= 0; i--)
       {
           printf("%d", nCode[i]);
       }
      
       return 0;
    }  

                         

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值