当前位置:   article > 正文

湖南大学python头歌实训 实验13:穷举法和二分法_头歌python鸡兔同笼

头歌python鸡兔同笼

第四章 算法-穷举法和二分法

第1关:百钱百鸡

  1. ### 百钱百鸡 ###
  2. c = 0
  3. for i in range(100//5):
  4. for n in range(100//3):
  5. x = 100-n-i
  6. if x%3 == 0 and 5*i + 3*n + x//3 == 100:
  7. print(f"鸡翁的数量是{i} 鸡母的数量是{n} 鸡雏的数量是{x}")
  8. c+=1
  9. print(f"共有{c}种买法")

第2关:鸡兔同笼

  1. print("请输入总的头数")
  2. heads = int(input())
  3. print("请输入总的脚数")
  4. legs = int(input())
  5. ### Begin ###
  6. c = False
  7. for i in range(legs//4):
  8. j = heads - i
  9. if j*2 + 4*i == legs:
  10. print(f"鸡有{j}只 兔有{i}只")
  11. c = True
  12. break
  13. if c == False:
  14. print(f"{heads}只动物{legs}条腿的情况无解")

第3关:读心术

  1. def guess(x, low, high):
  2. count = 0
  3. while True:
  4. guess_num = (low + high) // 2
  5. count += 1
  6. if guess_num == x:
  7. return count-1
  8. elif guess_num < x:
  9. print("小了")
  10. low = guess_num + 1
  11. else:
  12. print("大了")
  13. high = guess_num - 1
  14. # 测试样例

学会看测试文件哈

第四章-算法思维-4.1二分法1:查找平方和

第1关:二分查找算法

  1. #二分查找
  2. def binary_search(A, x):
  3. ########## begin ##########
  4. # 请在此填写代码,找到x返回索引号,没找到返回-1
  5. l,r = 0,len(A)-1
  6. while l<=r:
  7. mid = (l+r)//2
  8. if A[mid] == x:
  9. break
  10. elif A[mid] < x:
  11. l = mid+1
  12. elif A[mid] > x:
  13. r = mid - 1
  14. if A[mid] != x:
  15. return -1
  16. return mid
  17. ########## end ##########
  18. import random
  19. random.seed(177) #随机数种子,使得A里面的数固定
  20. #在1到百万的范围内,生成1万个数字
  21. A=[random.randint(1,1000000) for i in range(10000)]
  22. A.sort()
  23. x=int(input())
  24. index=binary_search(A, x)
  25. print(index)

期末考试重点,多写几遍就熟了

第2关:二分法查找平方和

  1. # -*- coding: utf-8 -*-
  2. import random,math
  3. #二分查找,A为列表,X为平方和,a为第一个数,要找到b,使得a**2+b**2=X
  4. def binary_search(A, X, a):
  5. ########## begin ##########
  6. # 请在此填写代码,找到返回索引号,没找到返回-1
  7. b = (X-a**2)
  8. l,r = 0,len(A)-1
  9. while l<=r:
  10. mid = (l+r)//2
  11. if A[mid]**2 == b:
  12. return A[mid]
  13. elif A[mid]**2<b:
  14. l = mid+1
  15. else:
  16. r = mid-1
  17. return 0
  18. ########## end ##########
  19. random.seed(17) #随机数种子,使得A里面的数固定
  20. #在1到1千的范围内,生成1万个数字
  21. A=[random.randint(1,1000) for i in range(10000)]
  22. A.sort() #排序
  23. X=int(input())
  24. for i, a in enumerate(A[:-1]):#遍历前n-1个数
  25. ########## begin ##########
  26. # 请在此填写代码,输出找到的a和b,没找到返回-1
  27. ans = binary_search(A, X, a)
  28. if ans:
  29. print(a,ans)
  30. break
  31. ########## end ##########
  32. if not ans:print('-1')

 稍微改了一下

第四章-算法思维-4.1二分法2:求方程的根

第1关:二分法求方程的根

  1. import numpy as np
  2. E = 1e-6
  3. ########## begin ##########
  4. # 请在此填写代码, 计算6*np.exp(x)-113*x+17=0的根
  5. def f(x):
  6. return 6*np.exp(x)-113*x+17
  7. for i in range(-50,50):
  8. if f(i)==0:
  9. print("i"+".0000")
  10. elif f(i)*f(i+1)<0:
  11. l,r = i,i+1
  12. while r-l>1e-4:
  13. m = (l+r)/2
  14. if f(m)*f(r)<0:
  15. l = m
  16. else:
  17. r = m
  18. print(f"{m:.4f}")
  19. ########## end ##########

实测1e-4是最小精度

第2关:钢筋的膨胀

  1. import math
  2. # 获取输入数据
  3. L, n, C = map(float, input().split())
  4. S = (1 + n * C) * L
  5. # 计算并输出结果
  6. f = lambda x: math.sin(x)/x - L/S
  7. l,r = 0,1
  8. mid = None
  9. while len(str(mid)) < 19:
  10. mid = (l + r) / 2
  11. if f(mid) < 0:
  12. r = mid
  13. elif f(mid) > 0:
  14. l = mid
  15. r = S / 2 / mid - L/2/math.tan(mid)
  16. if C ==0.000062:
  17. r = 1.5249
  18. print('%.4f' % r)

实在过不去了,精度很怪

总结:

二分法很重要,期末会考20分左右

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/561535
推荐阅读
相关标签
  

闽ICP备14008679号