水牛♂ToTo

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: :: 管理 ::
(6)_进制转换

      我们平常计算都是用十进制数的,但是有的时候我们需要用到2进制数、16进制数等。一个k进制的数可以表示为:(As-1 As-2… A0)k = As-1 K^(s-1) + As-2 K^(s-2) + … + A0 K^(0) ,记为<1>式,其中0<=Ai<K(I=0,1,2..s-1)。对于一个已知的正整数n,如何得到n的K进制表示呢?换句话说,我们就是要求出As-1 As-2… A0来。具体的求解顺序是:先求出A0,然后是A1 ……,最后得到An-1。将<1>式等号两边同时取模k得:n mod K = a0。得到A0以后,(n-A0) div K = As-1 K^(s-2) + As-2 K^(s-3) + … + A1 K^(0),用与求A0同样的方法可以得到A1,然后是A2……。Pascal 程序。运行这个程序,输入:155 16 就可以得到结果9B (16进制的9B = 9*16+11=155)
  怎么进行任意进制间的数的转换呢?已知一个数正整数n的P进制表示(As-1As-2…A0),求n的Q进制表示(Bl-1Bl-2…B0)。一种简单的方法是:根据P进制表示求出十进制的n,然后再将n转化为Q进制表示即可。
  前面考虑的都是整数的问题,我们现在来看看怎么处理实有理数。由于实数跟整数的区别仅仅在于小数部分,所以现在只考虑实数r,r满足0 <= r <1的情况。定义r的K进制表示为:r =(0.A1 A2 A3 … As)K = A1 K^(-1) + A2 K^(-2) + A3 K^(-3) …. As K^(-s)。求解顺序为:A1、A2……As。解法:r K = A1 + A2 K^(-1) + A3 K^(-2) …. As K^(-(s-1)) = A1 + B。考察一下B的范围0<= B <= (K-1)K^(-1) +(K-1)K^(-2)… (K-1)K^(-(s-1)) = 1-K^(-s) < 1,也就是说B是 r K 的小数部分,A1是整数部分,于是 A1 = [r K],[x]表示不大于x的最大整数。由于B = r-A1,所以用同样的方法分解 B 就可以得到 A2、A3……As。Pascal 程序。
posted on 2007-07-23 15:11  saintqdd  阅读(268)  评论(0)    收藏  举报