複製鏈接
請複製以下鏈接發送給好友

自守數

鎖定
自守數,亦稱同構數,是指一個數的平方的尾數等於該數自身的自然數。在十進制中,0, 1, 5, 6, 25, 76, 376, 625, 9376, 90625, 109376, 890625, 2890625, 7109376, 12890625, 87109376, 212890625, 787109376, 1787109376, ... 都是自守數 [1] 
中文名
自守數
外文名
Automorphic Number
別    名
同構數
代表數字
5, 6, 25
其他名詞
平凡自守數
意    思
某數平方末尾幾位數等這個數的數

目錄

自守數簡介

定義:自然數
稱為
-進制下的自守數當且僅當
能被
整除,其中
. 取
時即為此自守數的定義。
的平方的個位數仍然是
和(對任何
進制),稱為平凡自守數。
注意:當
為素數時,只有平凡自守數。
顯然,
是一位自守數(
,所以
是兩位自守數。
自守數有一個特性,以他為後幾位的兩個數相乘,乘積的後幾位仍是這個自守數。因為5是自守數,所以以
為個位數的兩個數相乘,乘積的個位仍然是
是自守數,所以以
為後兩位數的兩個數相乘,其結果的後兩位仍是
,如
三位自守數是
,四位自守數是
,五位自守數是
......
我們可以看到,
位的自守數出自
位的自守數。由此得出,如果知道
位的自守數
,那麼
位的自守數應當由
前面加上一個數構成。(僅對
的素因子個數為
時適用)
實際上,簡化一下,還能發現如下規律:
......
定理(自守數的對稱性):設
為非平凡自守數,
為最小的使得
的數,則
是自守數
證明:觀察易發現,因為
,則
,我們取模
的同餘,有
,最後一個同餘號成立是因為
為自守數
註記:其實對於平凡情形,這個定理也成立,如
是自守數,則
也是自守數。
定理:設
的不同的素因子個數為
,則大於
小於
的自守數的個數為
推論,
時,
位數的自守數有且只有兩個,二者它們的和等於
所以,兩個
位自守數,他們的和等於
.

自守數編程計算

JAVA
實現:
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 Zishoushu
5*5=25--> 5 is Zishoushu
6*6=36--> 6 is Zishoushu
25*25=625--> 25 is Zishoushu
76*76=5776--> 76 is Zishoushu
376*376=141376--> 376 is Zishoushu
625*625=390625--> 625 is Zishoushu
9376*9376=87909376--> 9376 is Zishoushu
c++的實現
#include<iostream.h>
class Self
{
    private:
    int a[20];
    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[j]=i;
                p++;
                j++;
            }
        }
    }
    void print()
    {
        cout<<"自守數的個數為:"<<p<<endl;
        for(int j=0;j<p;j++)
            cout<<a[j]<<'\t';
        cout<<endl;
    }
};
void main()
{
    Self test(1,110);
    test.process();
    test.print();
}
Python的實現
while True:
	try:
    n=int(input())
    for i in range(1+n):
    	if str(i)==str(i**2)[-len(str(i):]:
        	print(str(i))
    except:
    	break
    
參考資料