c语言自守数编程,自守数算法----C语言实现

#include

//自守数算法

//ep : 25 ^ 2 = 625 76 ^ 2 = 5776 9376 ^ 2 = 87909376

/*ep :

* 376 被乘数

* *376 乘数

* ------ ---------

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

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

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

*--------

* 141376

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

*/

/*由number的位数确定截取数字进行乘法时的系数k*/

#define forech_bit_num(mul,number,k) \

for(mul=number,k=1;(mul/=10)>0;k*=10) ;

//在0~xxxx这些数中寻找自守数

#define forech_number(number,num) \

for(number=0;number

//自守数核心算法:(部分积+截取被乘数的后N位*截取乘数的第M位),%kk再截取部分积

#define automorphic_number(mul,number,k,ll,kk) \

mul=(mul+(number%(k*10))*(number%ll-number%(ll/10)))%kk;

long print_automorphic_number(long num)

{

long mul,number,k,ll,kk;

forech_number(number,num)

{

forech_bit_num(mul,number,k);

kk=k*10; /*kk为截取部分积时的系数*/

mul=0; /*积的最后n位*/

ll=10; /*ll为截取乘数相应位时的系数*/

while(k > 0)

{

automorphic_number(mul,number , k ,ll ,kk);

k/=10; /*k为截取被乘数时的系数*/

ll*=10;

}

if(number==mul){ /*判断若为自守数则输出*/

printf("%ld ", number);

}

}

}

int main(void)

{

print_automorphic_number(1000);

return 0 ;

}

你可能感兴趣的:(c语言自守数编程)