10000以内的自守数自守数

自守数怎么写,麻烦帮忙做一个行吗,10000以内的自守数

#include<iostream>
#include<stdlib.h>
using namespace std;
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;
}

参考(10条消息) 【算法c++】---求100000以内自守数_小菜菜ovo的博客-CSDN博客

自守数:指一个数的平方的尾数等于该数自身的自然数
例: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;
}