自守数算法

简介: 自守数算法

算法举例

//自守数算法

例如:

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}

运行结果:

640.png

目录
相关文章
|
10月前
|
算法
给定两个数,求这两个数的最大公约数
给定两个数,求这两个数的最大公约数
|
10月前
练习实例 - 水仙花数
【1月更文挑战第14天】水仙花数。
64 0
|
5月前
求这两个数的最大公约数
【10月更文挑战第21天】求这两个数的最大公约数。
34 1
|
10月前
|
算法
容斥原理:能被整除的数
容斥原理:能被整除的数
|
9月前
|
Windows
1091 N-自守数 (15 分)
1091 N-自守数 (15 分)
|
程序员
【牛客网】HJ99 自守数、OR86 返回小于 N 的质数个数
目录 HJ99 自守数 OR86 返回小于 N 的质数个数
96 0
|
索引
三个数的最大乘积
三个数的最大乘积
81 0
|
Python
找几个数的最大乘积
找几个数的最大乘积
111 0
7-150 水仙花数
7-150 水仙花数
57 0