Python开平方
如题,如何使用Python开平方
1. 最简单的方法
将某个数乘以0.5次方
sqrtin=float(input(正数:))
sqrtout=sqrtin**0.5
print('平方根:',sqrtout)
2. 使用内置库math
import math
sqrtin=float(input(正数:))
sqrtout=math.sqrt(sqrtin)
print('平方根:',sqrtout)
3.复杂版1(摘抄)
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# 开平方
import time
class NumberNode(object):
def __init__(self, num):
self.num = num
self.square_result = 0
self.current_target_number = 0
self.square_result_str = ''
self.finished = False
@property
def data_list(self):
"""对num从低位向高位,每两位划分在一起,对num拆分成数组。
这么拆分的原因是,每次求根号的下一位,最大不会超过一百,所以向下获取两位用来求的开平方的下一位"""
number = self.num
divisor = 100
_data_list = []
while number:
remainder = number % divisor
_data_list.append(remainder)
number = number / divisor
return _data_list
@property
def data_list_len(self):
return len(self.data_list)
def get_target_number(self, index):
if index < self.data_list_len:
return self.data_list[self.data_list_len-1-index]
return 0
def get_reducer(self, index_ret):
return (self.square_result * 10 * 2 + index_ret) * index_ret
def reload_result(self, index_ret):
self.square_result = self.square_result * 10 + index_ret
ret_str_list = list(str(self.square_result))
ret_str_list.insert(self.data_list_len, '.')
self.square_result_str = ''.join(ret_str_list)
def reload_current_target_number(self, index, index_ret):
minute_ret = self.current_target_number - self.get_reducer(index_ret)
self.current_target_number = minute_ret * 100 + self.get_target_number(index)
if not self.current_target_number and index == self.data_list_len:
self.finished = True
def get_index_ret(self):
for i in range(9, -1, -1):
if self.get_reducer(i) <= self.current_target_number:
return i
return 0
def square(self):
"""计算开平方结果,主要理论依据是:(a.b)**2 == (a+0.b)**2 = a**2 + (0.b)**2 + 2*a*(0.b)"""
index = 0
index_ret = 0
self.reload_current_target_number(index, index_ret)
self.reload_result(index_ret)
while not self.finished:
index_ret = self.get_index_ret()
index += 1
self.reload_current_target_number(index, index_ret)
self.reload_result(index_ret)
print index_ret
print self.square_result_str
time.sleep(0.1)
print index_ret
print self.square_result_str
if __name__ == '__main__':
number = int(input('正数:'))
num_node = NumberNode(number)
num_node.square()
4.复杂版2(摘抄)

print('请输入开方正数:')
x2 = input() #输入开方数
x2 = x2 + "0000000000" #放大10位,即精确到小数点后5位
x = "" #开方结果
digits = len(x2) #统计位数
if digits % 2 == 1: #判断单双位数
x2_1 = int(x2[0:1]) #取第一个数
digit = 1 #从第一位后开始取数
digits = digits-1
else:
x2_1 = int(x2[0:2]) #取第一个数
digit = 2 #从第二位后开始取数
digits = digits - 2
if x2_1 >= 9*9: #判断a*a是否合适,并减出余数
x = "9" #计算第一个a*a
x2_2 = x2_1-9*9 #得出余数
elif x2_1 >= 8*8:
x = "8"
x2_2 = x2_1-8*8
elif x2_1 >= 7*7:
x = "7"
x2_2 = x2_1-7*7
elif x2_1 >= 6*6:
x = "6"
x2_2 = x2_1-6*6
elif x2_1 >= 5*5:
x = "5"
x2_2 = x2_1-5*5
elif x2_1 >= 4*4:
x = "4"
x2_2 = x2_1-4*4
elif x2_1 >= 3*3:
x = "3"
x2_2 = x2_1-3*3
elif x2_1 >= 2*2:
x = "2"
x2_2 = x2_1-2*2
elif x2_1 >= 1*1:
x = "1"
x2_2 = x2_1-1*1
else:
pass
while digits >= 2: #数字每两位取数
x2_2 = int(str(x2_2) + x2[digit:digit+2]) #余数补上后面两位数字
if x2_2 >= (2*int(x)*10+9)*9: #(2a+b)b
a2bb = "9"
x2_2 = x2_2-(2*int(x)*10+9)*9
elif x2_2 >= (2*int(x)*10+8)*8:
a2bb = "8"
x2_2 = x2_2 - (2 * int(x) * 10 + 8) * 8
elif x2_2 >= (2*int(x)*10+7)*7:
a2bb = "7"
x2_2 = x2_2 - (2 * int(x) * 10 + 7) * 7
elif x2_2 >= (2*int(x)*10+6)*6:
a2bb = "6"
x2_2 = x2_2 - (2 * int(x) * 10 + 6) * 6
elif x2_2 >= (2*int(x)*10+5)*5:
a2bb = "5"
x2_2 = x2_2 - (2 * int(x) * 10 + 5) * 5
elif x2_2 >= (2*int(x)*10+4)*4:
a2bb = "4"
x2_2 = x2_2 - (2 * int(x) * 10 + 4) * 4
elif x2_2 >= (2*int(x)*10+3)*3:
a2bb = "3"
x2_2 = x2_2 - (2 * int(x) * 10 + 3) * 3
elif x2_2 >= (2*int(x)*10+2)*2:
a2bb = "2"
x2_2 = x2_2 - (2 * int(x) * 10 + 2) * 2
elif x2_2 >= (2*int(x)*10+1)*1:
a2bb = "1"
x2_2 = x2_2 - (2 * int(x) * 10 + 1) * 1
elif x2_2 >= (2*int(x)*10+0)*0:
a2bb = "0"
x2_2 = x2_2 - (2 * int(x) * 10 + 0) * 0
else:
pass
x = str(x) #转为字符串
x = x + a2bb #将得到的数字连串起来
digit = digit+2
digits = digits-2
x = int(x)/100000 #缩小5位,补上小数点
print(x)
5. 复杂版3(摘抄)
tips:支持负数,10f为小数位数
import cmath
num = int(input("请输入一个数字: "))
num_sqrt = cmath.sqrt(num)
print('{0} 的平方根为 {1:0.10f}+{2:0.10f}j'.format(num ,num_sqrt.real,num_sqrt.imag))

浙公网安备 33010602011771号