#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 ;
}
本文同步分享在 博客“Engineer-Bruce_Yang”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。