打印
[程序源码]

戴上举老师书上的一个问题

[复制链接]
1605|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangch_sh|  楼主 | 2014-4-28 20:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在看戴上举老师的《删繁就简-单片机入门到精通》
第二章2.8查表与乘除法:
。。。。。。。。。。。。。。。。。。。。。。。。。。。
第78页,查表实现乘法。
造一个九九乘法表,只有45个数据。
mul_table_pro:
mul_table1_pro,mul_table2_pro,...mul_table9_pro;                      //各个分表的起始地址
mul_table1_pro:
1                                                                                       ;//第一个乘数为1分别乘1的结果
mul_table2_pro:
2,4                                                                                    ;//第一个乘数为2分别乘以1和2的结果
。。。。。
mul_table9_pro:
9,18,27,36,45,54,63,72,81                                               ;//第一个乘数为9分别乘以1~9的结果
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
我想了一下,这个表用C语言怎么实现呢?我想不出来,请高手指教,谢谢!

相关帖子

沙发
wangch_sh|  楼主 | 2014-4-28 21:44 | 只看该作者
高手支招啊!

使用特权

评论回复
板凳
ayb_ice| | 2014-4-29 06:07 | 只看该作者
查表都不会
做一个二维数组,用乘数与被乘数做为索引就可以了

使用特权

评论回复
地板
wangch_sh|  楼主 | 2014-4-29 07:59 | 只看该作者
关键是数组元素个数不一样啊。
第一个1个数,第二个两个数,。。。
第三个数9个数。

使用特权

评论回复
5
wangch_sh|  楼主 | 2014-4-29 09:21 | 只看该作者
没人知道吗?

使用特权

评论回复
6
popeye021| | 2014-4-29 10:00 | 只看该作者
wangch_sh 发表于 2014-4-29 07:59
关键是数组元素个数不一样啊。
第一个1个数,第二个两个数,。。。
第三个数9个数。 ...

不考虑rom消耗,直接定义数组a[9][9],就可以包括九九乘法表的所有情况了,考虑有乘数为0的情况自己类推。

使用特权

评论回复
7
wangch_sh|  楼主 | 2014-4-29 10:04 | 只看该作者
谢谢!那个我知道,戴老师的书里也说了,说那样费ROM,又举了上面的例子,不过只是写了程序示意。
我想不出来具体实现方法。
我用C写了个程序,可是不行。
#include<stdio.h>

#define uchar unsigned char

uchar mul_table1_pro[1]={1};
uchar mul_table2_pro[2]={2,4};
uchar mul_table3_pro[3]={3,6,9};
uchar mul_table4_pro[4]={4,8,12,16};
uchar mul_table5_pro[5]={5,10,15,20,25};
uchar mul_table6_pro[6]={6,12,18,24,30,36};
uchar mul_table7_pro[7]={7,14,21,28,35,42,49};
uchar mul_table8_pro[8]={8,16,24,32,40,48,56,64};
uchar mul_table9_pro[9]={9,18,27,36,45,54,63,72,81};
uchar *mul_table_pro[9]=
{
      mul_table1_pro,
      mul_table2_pro,
      mul_table3_pro,
      mul_table4_pro,
      mul_table5_pro,
      mul_table6_pro,
      mul_table7_pro,
      mul_table8_pro,
      mul_table9_pro,
};
uchar mul_pro(uchar x,uchar y)
{
      uchar z;
      if(x>y)
      {
             z=((mul_table_pro+x-1)+y-1);
      }
      else
      {
          z=((mul_table_pro+y-1)+x-1);
      }
      return z;
}
int main()
{
    uchar i;
    i=mul_pro(2,6);
   
    printf("%d\n",i);
    getchar();
}

使用特权

评论回复
8
wangch_sh|  楼主 | 2014-4-29 11:50 | 只看该作者
戴老师看到就好了。

使用特权

评论回复
9
通宵敲代码| | 2014-4-29 14:37 | 只看该作者
wangch_sh 发表于 2014-4-29 10:04
谢谢!那个我知道,戴老师的书里也说了,说那样费ROM,又举了上面的例子,不过只是写了程序示意。
我想不出 ...

两个办法,
要吗像上面那位仁兄说的费rom。
要吗自己编一个检索算法,应该也不难。

使用特权

评论回复
10
wangch_sh|  楼主 | 2014-4-29 15:28 | 只看该作者
好了。太简单了,不用麻烦戴老师了。
#include<stdio.h>

#define uchar unsigned char

uchar mul_table_pro[45]=
{
      1,
      2,4,
      3,6,9,
      4,8,12,16,
      5,10,15,20,25,
      6,12,18,24,30,36,
      7,14,21,28,35,42,49,
      8,16,24,32,40,48,56,64,
      9,18,27,36,45,54,63,72,81
};
uchar multi1[9]={0,1,3,6,10,15,21,28,36,45};
uchar mul_pro(uchar x,uchar y)
{
      uchar z;
      if(x>y)
      {
             z=mul_table_pro[multi1[x-1]+y-1];
      }
      else
      {
          z=mul_table_pro[multi1[y-1]+x-1];
      }
      return z;
}
int main()
{
    uchar i;
    i=mul_pro(6,9);
    printf("%d\n",i);
    getchar();
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:为江山踏坏了乌骓马,为社稷拉断了宝雕弓。

318

主题

2817

帖子

5

粉丝