"""
本程序目的是实现任意数值的算数平方根
大致思路
整数部分和小数部分需要单独考虑,所以第一步提取出整数部分和小数部分
针对整数部分,设计一个函数,设计到递归运算,传入的形参有运算值,上一轮传下的余数,以及之前产生的结果,
最后得出的结果有本轮的余数,产生的结果
"""
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)
ly_Python总结之五:任意数值的算数平方
最新推荐文章于 2024-04-14 21:33:50 发布