当前位置:首页 > 公众号精选 > 嵌入式云IOT技术圈
[导读]算法举例 //自守数算法 例如: 25 ^ 2 = 625   76 ^ 2 = 5776  9376 ^ 2 = 87909376 例如: 376        被乘数 376        乘数 ------  --------- 2256      第一个部分积=被乘数*乘数的倒数第一位 2632      第二个部分积=被乘数*乘数的倒数第三位 1125    


算法举例


//自守数算法

例如:

25 ^ 2 = 625   76 ^ 2 = 5776  9376 ^ 2 = 87909376

例如:

376        被乘数

376        乘数

------  ---------

2256      第一个部分积=被乘数*乘数的倒数第一位

2632      第二个部分积=被乘数*乘数的倒数第三位

1125      第三个部分积=被乘数*乘数的倒数第三位

--------

141376

将以上的部分积的后3位求和后截取后3位就是3位数乘积的后3位。

C语言实现
 1#include <stdio.h>
2
3/*由number的位数确定截取数字进行乘法时的系数k*/
4#define forech_bit_num(mul,number,k)  \
5            for(mul=number,k=1;(mul/=10)>0;k*=10) ;

6//在0~xxxx这些数中寻找自守数
7#define forech_number(number,num)     \
8            for(number=0;number<num;number++)

9//自守数核心算法:(部分积+截取被乘数的后N位*截取乘数的第M位),%kk再截取部分积
10#define automorphic_number(mul,number,k,ll,kk)   \
11        mul=(mul+(number%(k*10))*(number%ll-number%(ll/10)))%kk;

12long print_automorphic_number(long num)
13
{
14    long mul,number,k,ll,kk;
15    forech_number(number,num)
16    {
17        forech_bit_num(mul,number,k);
18        kk=k*10;      /*kk为截取部分积时的系数*/
19        mul=0;        /*积的最后n位*/
20        ll=10;        /*ll为截取乘数相应位时的系数*/
21        while(k > 0)
22        {
23            automorphic_number(mul,number , k ,ll ,kk);
24            k/=10;               /*k为截取被乘数时的系数*/
25            ll*=10;
26        }
27         if(number==mul){         /*判断若为自守数则输出*/
28              printf("%ld   ", number);
29         }
30    }
31
32}
33
34int main(void)
35
{
36    print_automorphic_number(1000);
37    return 0 ;
38}

运行结果:

韦东山老师嵌入式学习视频推荐





商务合作




免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
关闭
关闭