自守数:指一个数的平方的尾数等于该数自身的自然数
例:52 = 25 252 = 625 762 = 5776 93762 = 87909376
因为计算机不能算太大的数的,所以就模仿手算
例如:
因为76是两位数,所以我们只需要看结果的最后两位是否等于76就可以了,
而且,在计算过程中,并不是所有的值都能影响到结果的后两位,
第一个部分积中(即456):被乘数最后三位×乘数的倒数第一位。
第二个部分积中(即532):被乘数最后二位×乘数的倒数第二位。
int main()
{
for(int i=0; i<=100000; i++)
{
int i_mod = 1;//这个用来正向求模,即求被乘数的后几位
for(int j = i; j>0; j /= 10)
i_mod *= 10;
int a =i_mod;
int i_nimod = 10;//这个用来反向求模,即用来求乘数的倒数位
int total = 0;
//求出的值显然是错位的,让k循环一次都乘10,让他们相加,
//用来相加的是456 和 32,所以要让32*10,就是456+320 = 476
int k=1;
while(i_mod>0)
{
total += ((i%i_mod)*(i%i_nimod /(i_nimod/10)))%i_mod * k;
k *= 10;
i_mod /= 10;
i_nimod *= 10;
}
if(total%a == i)
cout<<i<<endl;
}
return 0;
}