bokee.net

其他职业博客

正文 更多文章

1.1 数字的转换和存储——第六课

1.1.1          课前小结

到目前为止,我们学习的C语言知识有

(1)语言的三要素:语法、语义和语用

(2)七个数学运算符,包括五个双目运算符+ - * / %,两个单目运算符-+

(3)六个比较运算符(关系运算符)==  !=  <  > <=  >=

(4)三个逻辑运算符 &&  ||  !

(5)赋值运算符,包括=  +=  -=  *=  /=  %=

(6)自增和自减运算符++ --

(7)四种文字常量:

      整型文字常量,又包括十进制、八进制、十六进制

浮点型文字常量

字符型文字常量

字符串文字常量

(8)四个基本类型名:int char float double

(9)标识符的语法和起名风格

(10)函数的声明和实现

(11)形参和实参

(12)函数和表达式的返回值、返回类型

(13)注释的语法和风格

(14)非十进制化为十进制数字

(15)if语句的基本语法形式

if (判断条件)

   语句块 ;

else

语句块 ;

(16)语句和语句块的概念

1.1.2          计算机中如何实现除法

计算机的基本运算是加法,减法是加法的逆运算。乘法是在加法的基础上实现的,除法的求商运算/和求模运算%都是在减法的基础上实现的。

对任给两个自然数a,b,想得到a/ba%b,计算机的过程如下:

(1)设置一个记数器count, 初值为0

(2)判断a是否已经小于b,如果是,余数为a,商为count中的当前值,计算结束。否则执行下一步

(3)a中减去b,并将计数器count1
       a -= b;
       ++count;
      
然后执行(2)
  
上面可以看出,除法的实际意义就是用一个测量单位(除数b)去丈量某个距离(被除数a)的过程,商就是测量的次数,余数就是最后一次测量时剩下的距离。

1.1.3          左移和右移

将一个N进制的数字A左移一位相当于 A *= N,

将一个N进制的数字A右移一位相当于 A /= N,且被移出最右边的数字就是A%N

1.1.4          数制的转换(二)——十进制转换成非十进制

先介绍一个数学定理,如果a%n=0, 那么(a+b)%n=b%n.

用文字说就是一个整数减去除数的倍数再取余,则余数不变。

由前面的叙述可知,计算机里的自然数取余运算就是用减法实现的,不断的减掉除数的倍数,当得到一个被除数小的数时,这个数就是余数。商就是减法运算的次数。

看几个实际的例子

10%5=5%5=0%5=0,中间减了两次,商为2

12%5=7%5=2%5=2,中间减了两次,商为2

23%7=16%7=9%7=2%7=2, 中间减了三次,商为3

   再复习一下上课的讲到的核心公式

设一个n进制数Am位。表达形式为

am-1 am-2 ...a1 a0其中 am-1 am-2 ...a1 a0均为0n-1的数字。

那么

A = am-1* n m-1 + am-2* n m-2  + ...+  a1* n+a0

其中n的幂叫做对应的权(power)

如对任何一个四位数,从右往左看,第一位的权是1,第二位的权是10,第三位的权是100,第四位的权是100

上面的公式用文字来说就是

各位的系数与该位的权的乘积之和。

将十进制数化为非十进制数就是上面公式的变形,我们要做的是知道A,求其各位的系数am-1  a0这里不加证明的给一个组等式.

最右边的数字a0 = A%n

a1 = (A/10)%n

a2 = (A/102)%n

am-1 = (A/10m-1)%n

看一个实际的例子,将1989转换为8进制,

分别计算1989/81989%8。可得

  1989/8=248,  1989%8 = 5;

 说明1989 = 248*8+5, 因此结果右边的第一个数(即类似于十进制的个位)就是5

由于上一步的商248依然大于8,继续计算 248/8, 248 %8,

  248 /8 = 31 ,248 %8=0,因此十位数字是0

实际上就是1989 = 248 *8+5 = (31*8+0)*8+5=31*82+0*81+5*80

第二步的商31依然大于8,继续计算 31/8, 31 %8,

  31 /8 = 3 ,31 %8=7,因此百位数字是7

第三步得到的商3已经小于8,把它作为千位数字,计算结束

所以最后所求的八进制数字是03705

上面的过程叫做辗转相除法。它其实就是下面的数学等式的变形

1989 = 248 *8+5 = (31*8+0)*8+5 = ((3*8+7)*8)+0)*8+5

= ((3*8+7)*8)*8+0*8+5 = ((3*8+7)*82+0*8+5 = 3*83+7*82+0*81+5*80

反过来看,八进制的03705转成10进制的数字1989,就是上面的等式的逆过程。

一般算法:将一个十进制的数A转换成n进制的数y,过程如下:

从当前的A中除去N, A, 并记录当前的余数yn-1

    yn-1 = A %N;

    A /= N

判断A是否已经为0,如果是,计算结束。否则继续执行

将计算过程中得到的余数从右到左写出,形式为

yn-1 y0

即为所求的结果。

用文字的话说就是反复除N,直到商为0,将余数相连即可。

 

从左移和右移的角度来说,上面的计算过程就是将数字每次右移一位,将移出的数字依次相连而已。当数字全部被移出时,计算就结束了。

分享到:

上一篇:1.1 数字的转换和存储——第五课

下一篇:1.1 数字的转换和存储——第七课