编程新手求助:生成0-9999符合特定规则的数字序列
解决0-9999有效数字生成问题
作为编程新手遇到这种带规则的筛选问题很正常,咱们一步步拆解来搞定它,逻辑捋顺了其实不难。
先拆解核心判断规则
首先把你的需求拆成两个可落地的小条件:
- 条件1:数字的每一位都不能是4或者8
- 条件2:把数字的各位相加,重复这个过程直到得到一个个位数(比如2356→16→7),这个最终结果也不能是4或者8
实现两个基础判断函数
先写两个小函数分别验证这两个条件,逻辑拆分后新手也能轻松理解:
1. 判断数字本身是否符合要求
把数字转成字符串,直接检查有没有'4'或'8'字符就行,简单直观:
def has_no_4_or_8(num): num_str = str(num) return '4' not in num_str and '8' not in num_str
2. 判断各位和的最终结果是否符合要求
这里需要循环计算各位和,直到结果变成个位数,再检查这个数是不是4或8:
def get_final_digit_sum(num): # 循环求和直到结果是个位数 while num >= 10: num = sum(int(digit) for digit in str(num)) return num def final_sum_is_valid(num): final_sum = get_final_digit_sum(num) return final_sum not in (4, 8)
遍历筛选所有有效数字
现在只需要遍历0到9999的所有数字,同时满足两个条件的就是我们要的有效数字:
valid_numbers = [] for num in range(10000): if has_no_4_or_8(num) and final_sum_is_valid(num): valid_numbers.append(num) # 打印前20个结果看看是否符合预期 print("前20个有效数字:", valid_numbers[:20])
小优化:减少不必要的遍历
其实我们可以不用遍历全部10000个数,因为条件1已经限制了每一位只能是0、1、2、3、5、6、7、9(共8种选择),直接生成符合条件1的数再检查条件2,效率会更高:
valid_numbers = [] # 遍历四位的每一位(千、百、十、个) allowed_digits = [0,1,2,3,5,6,7,9] for thousands in allowed_digits: for hundreds in allowed_digits: for tens in allowed_digits: for units in allowed_digits: num = thousands * 1000 + hundreds * 100 + tens * 10 + units if final_sum_is_valid(num): valid_numbers.append(num) print("有效数字总数:", len(valid_numbers))
验证示例数字
拿你提到的2356测试一下:
print(has_no_4_or_8(2356)) # 输出True,符合条件1 print(final_sum_is_valid(2356)) # 输出True,符合条件2
完全符合要求,说明逻辑是对的。
如果有哪段代码或者逻辑没搞懂,随时问细节就行~
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

