ly_Python总结之五:任意数值的算数平方

"""
本程序目的是实现任意数值的算数平方根
大致思路
整数部分和小数部分需要单独考虑,所以第一步提取出整数部分和小数部分
针对整数部分,设计一个函数,设计到递归运算,传入的形参有运算值,上一轮传下的余数,以及之前产生的结果,
最后得出的结果有本轮的余数,产生的结果
"""
import re
h = 0
def rel(rel_data):
    """用于将传入的数值的整数部分和小数部分分别提取出来"""
    # data_list = list(rel_data)
    # n = 0
    # for string in data_list:  # 找到小数点的位置
    #     if string == ".":
    #         n = data_list.index(".")
    #         break
    # if n > 0:  # 小数,将整数部分和小数部分放进两个列表
    #     data_1 = data_list[:n]
    #     data_2 = data_list[n + 1:]
    # else:  # 整数,和上面一样的操作,只不过此时小数部分是空列表
    #     data_1 = data_list
    #     data_2 = []
    data = re.match(r"([\d]+)\.([\d]*)", rel_data)
    if data:
        data_1 = list(data.group(1))
        data_2 = list(data.group(2))
    else:
        data_1 = list(rel_data)
        data_2 = []
    if len(data_1) % 2 == 0:  # 开始处理整数部分,如果整数位数为偶
        num = int("".join(data_1[:2]))
        n = len(data_1) // 2
    else:  # 如果整数部分位数为奇
        num = int(data_1[0])
        n = len(data_1) // 2 + 1  # 找出首先要参与运算的部分,并且更新列表
    result = count(0, num, 0, data_1, data_2, n)  # 在这个函数内部调用接下来的运算函数
    return n, result


def count(result, recent_num, least_num, data_1, data_2, n):
    """用于运算,参数有被开方数,两部分,上一轮遗留的余数,这一轮参与计算的值
    已经产生的结果,以及完整的数据
    """
    global h
    temp_num = least_num * 100 + recent_num  # 参与运算的值,两部分recent_num,least_num
    for s in range(10):
        r_num = (20 * result + s) * s
        if temp_num - r_num >= 0:
            least_num = temp_num - r_num
        else:
            result = result * 10 + s - 1
            break
    if n <= 1 and least_num == 0:
        if (result*result) == l:
            return result
        h += 1
    elif g == (1 - n):
        return result
    else:
        pass
    if n > 2:
        return count(result, int("".join(data_1[-2 * (n - 1): -2 * (n - 2)])), least_num, data_1, data_2, n - 1)
    elif n == 2:
        return count(result, int("".join(data_1[-2 * (n - 1):])), least_num, data_1, data_2, n - 1)
    else:
        data_2 += ["0", "0", "0"]
        return count(result, int("".join(data_2[-2 * (n - 1):-2*(n-2)])), least_num, data_1, data_2, n - 1)


def ly_sqrt(rel_data, k):
    global g,l
    g = k
    l = rel_data
    n, r_result = rel(str(rel_data))
    list_result = list(str(r_result))
    if h > 0:
        for f in range(h):
            list_result.insert(0, "0")
    if n == len(list_result):
        pass
    else:
        list_result.insert(n, ".")
    result = "".join(list_result)
    return result


if __name__ == "__main__":
    n = ly_sqrt(256, 0)
    print(n)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值