自守数,亦称同构数,是指一个数的平方的尾数等于该数自身的自然数。在十进制中,0, 1, 5, 6, 25, 76, 376, 625, 9376, 90625, 109376, 890625, 2890625, 7109376, 12890625, 87109376, 212890625, 787109376, 1787109376, ... 都是自守数。
自守数,亦称同构数,是指一个数的平方的尾数等于该数自身的自然数。在十进制中,0, 1, 5, 6, 25, 76, 376, 625, 9376, 90625, 109376, 890625, 2890625, 7109376, 12890625, 87109376, 212890625, 787109376, 1787109376, ... 都是自守数。
定义:自然数
称为-进制下的自守数当且仅当能被整除,其中. 取时即为此自守数的定义。和的平方的个位数仍然是和(对任何进制),称为平凡自守数。
注意:当
为素数时,只有平凡自守数。显然,
和是一位自守数(),所以和是两位自守数。
自守数有一个特性,以他为后几位的两个数相乘,乘积的后几位仍是这个自守数。因为5是自守数,所以以
为个位数的两个数相乘,乘积的个位仍然是;是自守数,所以以为后两位数的两个数相乘,其结果的后两位仍是,如。三位自守数是
和,四位自守数是和,五位自守数是和......我们可以看到,
位的自守数出自位的自守数。由此得出,如果知道位的自守数实际上,简化一下,还能发现如下规律:
......
定理(自守数的对称性):设
为非平凡自守数,为最小的使得的数,则是自守数证明:观察易发现,因为
,则,我们取模的同余,有,最后一个同余号成立是因为为自守数注记:其实对于平凡情形,这个定理也成立,如是自守数,则
也是自守数。定理:设
的不同的素因子个数为,则大于小于的自守数的个数为个推论,
时,位数的自守数有且只有两个,二者它们的和等于所以,两个
位自守数,他们的和等于.实现:
public class ZishouNumber { public static void main(String args) { for(int i = 1; i < 10000; i++){ String strI = String.valueOf(i); String multiStr = String.valueOf(i*i); String last = multiStr.substring(multiStr.length() - strI.length()); if(last.equals(strI)){ System.out.println(i + "*" + i + "=" + multiStr + "--> " + i + " is Zishoushu"); } } }}--------------------------
1*1=1--> 1 is Zishoushu5*5=25--> 5 is Zishoushu6*6=36--> 6 is Zishoushu25*25=625--> 25 is Zishoushu76*76=5776--> 76 is Zishoushu376*376=141376--> 376 is Zishoushu625*625=390625--> 625 is Zishoushu9376*9376=87909376--> 9376 is Zishoushu
#include<iostream.h>class Self{ private: int a; int m,n,p; public: Self(int _m,int _n) { m=_m;n=_n; } void process() { int pf; int j=0; p=0; for(int i=m;i<=n;i++) { int k=i; pf=k*k; while(k!=0) { if((pf%10)!=(k%10))break; k=k/10; pf=pf/10; } if(k==0) { a=i; p++; j++; } } } void print() { cout<<"自守数的个数为:"<<p<<endl; for(int j=0;j<p;j++) cout<<a<<'t'; cout<<endl; }};void main(){ Self test(1,110); test.process(); test.print();}while True:try: n=int(input()) for i in range(1+n): if str(i)==str(i**2): print(str(i)) except: break