#include <stdio.h>
main()
{
long m,n,k,k1,a;
for (n = 0; n < 200000; n++)
{
for (m = n,k=1;(m/=10)>0; k*=10); //首先由n的值来确定最终截取尾数的长度,用k表示
k1 = k*10; //k1为截取部分积时的系数
m = 0; //积的最后N位
a = 10; // a为截取乘数相应位时的系数
while (k > 0)
{
m = (m + (n%(k*10)) * (n%a - n%(a/10))) % k1; //(部分积+截取的后N位*截取乘数的第M位) 再截取部分积
k/=10; // k为截取被乘数时的系数
a*=10;
}
if (n == m)
{
printf ("%ld\n",n);
}
}
}
此题是求200000内的自守数。
难点在于计算机无法表示过大的数。这时候就必须寻找其中的规律
while语句是整个程序的重点
要善于整合和寻找数之间的关系