算法学习(9)数学问题求解系列(6)自守数(普通解法及拓展)

前言

自守数也是一个很容易用编程解决的数学问题,不过,教材提到的一个点,值得深入研究。

问题

计算指定范围内的所有自守数

名词解释

自守数,指一个数平方结果的后几位,等于这个数本身。如 25×25=62525\times25=62525×25=625, 625625625的后两位等于乘数25,所以是一个自守数。

编程思路

  1. 很容易发现,一个数是几位数,那么就得截取乘积的后几位数,所以,得编写确定一个数位数的子函数
  2. 提取乘积的后几位,可以利用上一篇博客提取特定位数的方法
  3. 直接比较验证

实现代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date    : 2019-04-06 12:40:29
# @Author  : Promise (promise@mail.ustc.edu.cn)
# @Link    : ${link}
# @Version : $Id$

import time


# 自守数,就是一个数平方结果的后几位,等于自身
# 编程思路:1)读取数是几位数 k
#          2)然后取余 10**k
# 编写判断位数的函数
def bitJudge(num):
    temp = num
    bit = 0
    while temp > 0:  # 至少是个位数
        bit += 1
        temp //= 10  # 减少一位
    return bit


# 主函数
def findAutomorphic(maxLimit):
    count = 0
    for i in range(maxLimit):
        bit_count = bitJudge(i)
        lastBit = (i**2) % (10**bit_count)  # 有几位就取余几位,如果是两位数,就取余 10^2 = 100
        if lastBit == i:
            print(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值