自守數(shù)算法
時間:2020-09-08 01:55:53
手機看文章
掃描二維碼
隨時隨地手機看文章
[導讀]算法舉例 //自守數(shù)算法 例如: 25 ^ 2 = 625 ? 76 ^ 2 = 5776 ?9376 ^ 2 = 87909376 例如: 376 ? ? ? ?被乘數(shù) 376 ? ? ? ?乘數(shù) ------ ?--------- 2256 ? ? ?第一個部分積=被乘數(shù)*乘數(shù)的倒數(shù)第一位 2632 ? ? ?第二個部分積=被乘數(shù)*乘數(shù)的倒數(shù)第三位 1125 ? ?
//自守數(shù)算法
例如:
25 ^ 2 = 625 76 ^ 2 = 5776 9376 ^ 2 = 87909376
例如:
376 被乘數(shù)
376 乘數(shù)
------ ---------
2256 第一個部分積=被乘數(shù)*乘數(shù)的倒數(shù)第一位
2632 第二個部分積=被乘數(shù)*乘數(shù)的倒數(shù)第三位
1125 第三個部分積=被乘數(shù)*乘數(shù)的倒數(shù)第三位
--------
141376
將以上的部分積的后3位求和后截取后3位就是3位數(shù)乘積的后3位。
1#include <stdio.h>
2
3/*由number的位數(shù)確定截取數(shù)字進行乘法時的系數(shù)k*/
4#define forech_bit_num(mul,number,k) \
5 for(mul=number,k=1;(mul/=10)>0;k*=10) ;
6//在0~xxxx這些數(shù)中尋找自守數(shù)
7#define forech_number(number,num) \
8 for(number=0;number<num;number++)
9//自守數(shù)核心算法:(部分積+截取被乘數(shù)的后N位*截取乘數(shù)的第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為截取部分積時的系數(shù)*/
19 mul=0; /*積的最后n位*/
20 ll=10; /*ll為截取乘數(shù)相應位時的系數(shù)*/
21 while(k > 0)
22 {
23 automorphic_number(mul,number , k ,ll ,kk);
24 k/=10; /*k為截取被乘數(shù)時的系數(shù)*/
25 ll*=10;
26 }
27 if(number==mul){ /*判斷若為自守數(shù)則輸出*/
28 printf("%ld ", number);
29 }
30 }
31
32}
33
34int main(void)
35{
36 print_automorphic_number(1000);
37 return 0 ;
38}
運行結(jié)果:
免責聲明:本文內(nèi)容由21ic獲得授權后發(fā)布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!