【算法c++】---求100000以内自守数

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值