06函数
二分法求平方根
tips:
- 二分法求解思路
- 精度控制
import math
n, delta = map(eval, input().split(','))
def sqrt_binary(n, delta):
a, b = 0, n+0.25# 初始化区间
while True:
x = (a+b)/2
if abs(x**2 - n) < delta:# 精度足够
print('{:.8f}'.format(x))
break
elif x**2 - n < 0:# 不够大,更新下界
a = x
else:# 太大了,更新上界
b = x
sqrt_binary(n, delta)
print('{:.8f}'.format(math.sqrt(n)))
汉诺塔
def hanota(n,a,b,c):
if n == 1:
print('{} --> {}'.format(a, c))
else:
hanota(n-1, a, c, b)
print('{} --> {}'.format(a, c))
hanota(n-1, b, a, c)
if __name__ == '__main__':
n = eval(input())
a,b,c = input().split()
hanota(n, a, b, c)
特殊的数字
描述
1179 能用 3 种方法表示为 3 个不同素数平方和的整数。
如:
1179 = 1717 + 1919 + 23*23
1179 = 77 + 1313 + 31*31
1179 = 77 + 1717 + 29*29
请输出能用 6 种方式表示为 3 个不同素数平方和的最小整数。
(本题涉及的最大素数不超过100)
def prime(n):
'''高效创建素数集列表'''
flag = [1]*(n+2)
p=2
ls = []
while(p<=n):
ls.append(p)
for i in range(2*p,n+1,p):
flag[i] = 0
while 1:
p += 1
if(flag[p]==1):
break
return ls
import itertools
ls = prime(100)
ls_2 = [s**2 for s in ls]
mul = []
for item in itertools.combinations(ls_2, 3):
mul.append(sum(item))
mul.sort() #需要排一下序,题目要求是输出最小整数
for i in mul:
if mul.count(i) == 6:
print(i)
break
参考答案,两个点效率不高,一个是素数集的创建,一个是最后查找最小整数,但是函数式编程的思想值得学习。
from itertools import combinations
def is_prime(n):
"""判断素数的函数,接收一个正整数为参数,参数是素数时返回True,否则返回False
减小判定区间,减少循环次数,提升效率"""
if n < 2