2525=625 7676=5776 9376*9376=87909376;
输入:n(自守数的位数)(n <= 15);输出:n 位的自守数
#include<stdio.h>
#include<math.h>
int main()
{
int n;
long long mul, number, k, a, b;
scanf("%d",&n);
for( number=pow(10,n-1); number<pow(10,n); number++ )
{
for( mul=number, k=1; (mul/=10)>0; k*=10 );
a = k * 10;
mul = 0;
b = 10;
while(k>0)
{
mul=( mul + ( number%(k*10) )*( number%b - number%(b/10) ) )%a;
k /= 10;
b *= 10;
}
if(number == mul)
printf("%lld\n", number);
}
return 0;
}
想到3个
第一个 for( mul=number, k=1; (mul/=10)>0; k*=10 );这句话是不是多余,在循环外面用pow算下值,这里n是知道的
第二个 平方的之后末尾只会出现 0 1 4 5 6 9 , 2 3 7 8末尾的可以直接pass掉 并且这里只有可能末尾是1 5 6的数字
第三个 把平方换成多项式 取有效的数 比如25 * 25 =(20+5)^2 取有效位 20 * 5 * 2 + 5 * 5
可以在想想是否还有其它规律
要算到15位数吗,long long int 也会溢出啊。