中科因仑“3+1”工程特种兵精英论坛

标题: 用“整除求商求余”来拆分提取一个数的个十百千位。 [打印本页]

作者: 张衍波    时间: 2015-9-24 08:10
标题: 用“整除求商求余”来拆分提取一个数的个十百千位。
利用“整除求商求余”来拆分提取一个数的个十百千位。
上两节讲了整除的求商求余运算符,这两个运算不仅能用在数学运算中,还可以用来拆分提取一个数的个十百千位。提取这些位有什么用呢?因为在以后的单片机显示程序中,不管是液晶屏还是数码管,必须用到这种提取算法,先把一个数的个十百千位一个个拆分提取出来,然后再送到显示屏上显示,所以这种算法很常见和实用。上述提到的“个,十,百,千”位只是一个虚数,具体是多少应该根据实际项目而定,也有可能是“个,十,百,千,万,十万,百万...”等位,但是处理的思路和方法都是一致的。
拆分提取的思路。比如8562这个数,千位是8,百位是5,十位是6,个位是2。可以依次看成是:
8=8562/1000;
5=562/100;
6=62/10;
2=2/1;
复制代码

上述用到了整除求商,但是562,62,2又是如何通过8562分解得到的呢?需要用到整除求余:
562=8562%1000;
62=8562%100;
2=8562%10;
复制代码

最后综合在一起,连在一起写:
8=8562/1000;
5=8562%1000/100;
6=8562%100/10;
2=8562%10/1;
复制代码

因为我们预先知道了这个数最大位是千位,所以千位直接整除1000求商就可以了。实际项目中,我们只是用某个变量,而这个变量的大小我们并不知道具体是什么,它的最大位可能并不止千位,也有可能是万位,所以需要把上述最高位的千位也做一下整除10000求余数,然后在整除1000求商,最后整理如下:
8=8562%10000/1000;
5=8562%1000/100;
6=8562%100/10;
2=8562%10/1;
复制代码

大家仔细观察和品味一下,很容易发现规律和原因,如果求万,十万,百万,也是用一样的方法。多提醒一句,根据我的经验,有一些单片机的C编译器可能不支持long类型数据的求余求商连写在一起,那么就要用一个中间变量分两步走,先求余,再求商,分开来操作。比如:
8=8562%10000/1000;
复制代码

分成两步走:
a=8562%10000;
a=a/1000;
复制代码

上述的变量a就是引入的中间变量。
现在编写一个程序来练习刚才讲到的内容,最后把程序编译后下载到坚鸿51学习板观察结果。请直接复制第十节模板程序,修改的main程序代码如下:
void main() //主程序
{
/*---C语言学习区域的开始---------------------------------------------------------------------------*/

  unsigned char a;
  unsigned char b;
  unsigned char c;
  unsigned char d;
        unsigned int  x=8562;  //初始化为8562,注意必须是int类型以上,不能是char类型,char最大范围是255。

  a=x%10000/1000;  //拆分提取千位
  b=x%1000/100;    //拆分提取百位
  c=x%100/10;      //拆分提取十位
  d=x%10/1;        //拆分提取个位



  GuiWdData0=a;   //把a这个变量放到窗口变量0里面显示
  GuiWdData1=b;   //把b这个变量放到窗口变量1里面显示
  GuiWdData2=c;   //把c这个变量放到窗口变量2里面显示
  GuiWdData3=d;   //把d这个变量放到窗口变量3里面显示


/*---C语言学习区域的结束---------------------------------------------------------------------------*/
   while(1)  
   {
      initial();
      key_service();
      display_service();
   }

}
复制代码

    查看运算结果的方法。如何在坚鸿51学习板上观察变量?按下S1或者S5按键即可切换显示不同的窗口,从而显示不同的变量。按下S9按键不松手就可以切换到十六进制的显示界面,松开手后会自动切换到十进制的界面。上坚鸿51学习板观察程序执行的结果如下:
     变量a为8。
     变量b为5。
     变量c为6。
     变量d为2。
     下节预告:逻辑运算符的“与”运算。
(未完待续)转载






欢迎光临 中科因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/) Powered by Discuz! X3.4