小明在研究数字的低中高问题。对于两个数字,计算两个数字之差的绝对值,定义: 1)如果该绝对值>=0 且<=3,对应'低';2)如果该绝对值>3 且<=6,对应'中';3)如果 该绝对值>6 且<=9,对应'高'。 对于 k 位数 n,从左到右每两个数字依次按上述规则进行转换,可以得到长度为 k-1 的字符串。例如:4 位数 3812,其相邻的两个数字之差的绝对值从左到右分别是 5(对应 3 和 8)、7(对应 8 和 1)和 1(对应 1 和 2);按上述规则转换 5、7 和 1 分别对应'中'、'高' 和'低',最终得到长度为 3 的字符串'中高低'。 在上述定义和说明的基础上,小明计划实现如下三个函数: 1)函数 get_dzg(n):当 n>=10 时, n 按上述规则转换为由低中高字符组成的字符串, 我们称其为 n 对应的低中高值,函数返回该字符串;当 n<10 时,触发异常 ValueError, 原因为'参数值不能小于整数 10'; 2)函数 stat_dzg(k):其中 k 代表数字的位数。函数对每一个可能的 k 位数,比如为 m,调用函数 get_dzg(m)得到其低中高值。我们想要统计各种不同的低中高值所出现的次 数,采用字典记录这些信息,低中高值作为字典的 key,其所对应的 value 为低中高值为 key 的 k 位数的个数。函数返回该字典。 3)函数 stat_dzg_probability(k):统计所有 k 位数中'低'、'中'或'高'连续出现至 少两次的概率,函数返回该概率值。提示:可以在调用函数 stat_dzg 后进行处理。 请帮助小明编写代码实现这三个函数。
时间: 2024-03-21 15:37:50 浏览: 129
python怎么对数字进行过滤
以下是小明实现的三个函数:
```python
def get_dzg(n):
if n < 10:
raise ValueError("参数值不能小于整数 10")
nums = [int(d) for d in str(n)]
dzg = []
for i in range(len(nums)-1):
diff = abs(nums[i] - nums[i+1])
if diff >= 0 and diff <= 3:
dzg.append('低')
elif diff > 3 and diff <= 6:
dzg.append('中')
elif diff > 6 and diff <= 9:
dzg.append('高')
return ''.join(dzg)
def stat_dzg(k):
if k < 2:
raise ValueError("参数值不能小于整数 2")
dzg_dict = {}
for i in range(10**(k-1), 10**k):
dzg = get_dzg(i)
if dzg in dzg_dict:
dzg_dict[dzg] += 1
else:
dzg_dict[dzg] = 1
return dzg_dict
def stat_dzg_probability(k):
dzg_dict = stat_dzg(k)
total_count = sum(dzg_dict.values())
dzg_prob = 0
for count in dzg_dict.values():
if count >= 2:
dzg_prob += count
return dzg_prob / total_count
```
函数 `get_dzg(n)` 接收一个整数 `n`,将其按照题目中的规则转换为低中高字符组成的字符串,并返回该字符串。如果 `n<10`,则触发异常并抛出错误信息。
函数 `stat_dzg(k)` 接收一个整数 `k`,将所有可能的 k 位数转换成低中高字符串,并统计各个低中高字符串出现的次数,返回一个字典,其中键为低中高字符串,值为该字符串出现的次数。如果 `k<2`,则触发异常并抛出错误信息。
函数 `stat_dzg_probability(k)` 接收一个整数 `k`,调用函数 `stat_dzg(k)` 统计低中高字符串出现的次数,并计算出现至少两次的低中高字符串的概率,返回该概率值。
阅读全文