p ython韩信点兵
时间: 2024-01-17 16:03:07 浏览: 88
以下是 Python 代码实现韩信点兵问题:
```python
n = int(input()) # 输入总人数
soldiers = list(map(int, input().split())) # 输入每个士兵的报数
# 计算最小公倍数
def lcm(a, b):
return a * b // gcd(a, b)
# 计算两数的最大公约数
def gcd(a, b):
if b == 0:
return a
return gcd(b, a % b)
lcm_num = soldiers[0] # 初始化最小公倍数
for i in range(1, n):
lcm_num = lcm(lcm_num, soldiers[i])
# 统计符合条件的士兵数量
count = 0
for i in range(n):
if lcm_num % soldiers[i] == 0:
count += 1
print(count)
```
解释一下代码:
1. 首先输入总人数和每个士兵的报数。
2. 定义一个计算最小公倍数的函数 `lcm` 和一个计算最大公约数的函数 `gcd`。
3. 初始化最小公倍数为第一个士兵的报数,然后遍历每个士兵的报数,依次求出它们的最小公倍数。
4. 最后统计符合条件的士兵数量,即最小公倍数能够被每个士兵的报数整除的士兵数量。
5. 输出符合条件的士兵数量。
这段代码的时间复杂度为 $O(n\log n)$,其中 $\log n$ 是求最大公约数的时间复杂度。
阅读全文